Skip to content

Commit a3dc8ae

Browse files
committed
Enhance cat and wc tools: improve line numbering logic and aggregate results
1 parent 7e70d1c commit a3dc8ae

2 files changed

Lines changed: 28 additions & 5 deletions

File tree

implement-shell-tools/cat/cat.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ function cat(files, options) {
1212
const lines = data.split('\n');
1313

1414
lines.forEach((line) => {
15-
const prefix = options.numberNonEmpty && line.trim() ? `${lineNumber}\t` : options.numberLines ? `${lineNumber}\t` : '';
15+
let prefix = '';
16+
if (options.numberNonEmpty && line.trim()) {
17+
prefix = `${lineNumber}\t`;
18+
} else if (options.numberLines) {
19+
prefix = `${lineNumber}\t`;
20+
}
1621
console.log(`${prefix}${line}`);
1722
if (prefix) lineNumber++;
1823
});

implement-shell-tools/wc/wc.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ function countFile(file, options) {
1111
const bytes = Buffer.byteLength(data, 'utf8');
1212

1313
const results = [];
14-
if (options.lines) results.push(lines);
15-
if (options.words) results.push(words);
16-
if (options.bytes) results.push(bytes);
14+
if (options.lines || (!options.lines && !options.words && !options.bytes)) results.push(lines);
15+
if (options.words || (!options.lines && !options.words && !options.bytes)) results.push(words);
16+
if (options.bytes || (!options.lines && !options.words && !options.bytes)) results.push(bytes);
1717

1818
console.log(`${results.join('\t')}\t${file}`);
19+
20+
return { lines, words, bytes };
1921
} catch (err) {
2022
console.error(`wc: ${file}: ${err.code === 'ENOENT' ? 'No such file or directory' : 'An error occurred'}`);
2123
process.exit(1);
@@ -49,9 +51,25 @@ function main() {
4951
process.exit(1);
5052
}
5153

54+
let totalLines = 0;
55+
let totalWords = 0;
56+
let totalBytes = 0;
57+
5258
files.forEach((file) => {
53-
countFile(file, options);
59+
const { lines, words, bytes } = countFile(file, options);
60+
totalLines += lines;
61+
totalWords += words;
62+
totalBytes += bytes;
5463
});
64+
65+
if (files.length > 1) {
66+
const totalResults = [];
67+
if (options.lines || (!options.lines && !options.words && !options.bytes)) totalResults.push(totalLines);
68+
if (options.words || (!options.lines && !options.words && !options.bytes)) totalResults.push(totalWords);
69+
if (options.bytes || (!options.lines && !options.words && !options.bytes)) totalResults.push(totalBytes);
70+
71+
console.log(`${totalResults.join('\t')}\ttotal`);
72+
}
5573
}
5674

5775
main();

0 commit comments

Comments
 (0)