如何组合一组文本文件,而不是每个文件的第一行?

Air*_*Air 0 bash shell file-io

作为正常工作流程的一部分,我收到一组文本文件,每个文件包含一个标题行.对于我来说,将它们作为单个文件使用会更方便,但如果我cat这些天真的话,首先导致文件中的标题行会导致问题.

这些文件往往足够大(10 3 -10 5行,5-50 MB),并且数量足够大,以至于在编辑器中或逐步执行此操作很尴尬和/或繁琐,例如:

$ wc -l *
    20251 1.csv
   124520 2.csv
    31158 3.csv
   175929 total

$ tail -n 20250 1.csv > 1.tmp

$ tail -n 124519 2.csv > 2.tmp

$ tail -n 31157 3.csv > 3.tmp

$ cat *.tmp > combined.csv

$ wc -l combined.csv
175926 combined.csv
Run Code Online (Sandbox Code Playgroud)

看起来这应该在一行中可行.我已经分离出了我需要的论点,但是我很难弄清楚如何匹配它们tail并从总线中减去1(我不习惯awk):

$ wc -l * | grep -v "total" | xargs -n 2
20251 foo.csv
124520 bar.csv
31158 baz.csv
87457 zappa.csv
7310 bingo.csv
29968 niner.csv
2086 hella.csv

$ wc -l * | grep -v "total" | xargs -n 2 | tail -n
tail: option requires an argument -- n
Try 'tail --help' for more information.
xargs: echo: terminated by signal 13
Run Code Online (Sandbox Code Playgroud)

Air*_*Air 7

您不需要wc -l用来计算要输出的行数; tail可以跳过第一行(或前K行),只需+在使用-n(或--lines)选项时添加符号,如手册页中所述:

  -n, --lines=K            output the last K lines, instead of the last 10;
                             or use -n +K to output starting with the Kth
Run Code Online (Sandbox Code Playgroud)

这使得将目录中的所有文件组合在一起,而不是每个文件的第一行,如下所示:

$ tail -q -n +2 * > combined.csv

$ wc -l *
    20251 foo.csv
   124520 bar.csv
    31158 baz.csv
    87457 zappa.csv
     7310 bingo.csv
    29968 niner.csv
     2086 hella.csv
   302743 combined.csv
   605493 total
Run Code Online (Sandbox Code Playgroud)

-q当为多个文件进行通配时,该标志会抑制输出中的标题tail.

  • 请加入并给我高兴你的回答:-) (2认同)