bash one liner来逐行组合文本文件,除了第一个文件之外的每个文件中的第一行除外

时间:2017-03-30 10:31:55

标签: bash unix text text-processing

我目前正在使用此脚本执行此操作:

head -1 file001.txt > all.txt; tail -n +2 -q *.txt >> all.txt

它没有问题,从第一个文件中获取标题然后连接其他文件。

问题是:

其他行都在一行中,而不是每行都在单独的行中。请帮助纠正这个问题。


如果你有任何其他的衬垫可以完成这项工作,那么很受欢迎。

所需的答案是:

获取带有该扩展名的任何文件的标题,我不想提供任何特定文件名,例如 file001.txt ,我更喜欢它从任何文件中取出它,因为无论如何它们都有相同的标题。但我的文件名可能不是 file001.txt 模式,这就是我说任何带有该扩展名的文件的原因。

2 个答案:

答案 0 :(得分:2)

使用awk

awk 'FNR==1&&!ctr++;FNR!=1' *.txt

说明:

  1. FNR是当前输入文件的行号
  2. ctr是一个从0开始并递增的变量  每次我们看到文件的第一行
  3. ctr对于第一个输入文件仅为零,因此!ctr仅为真  对于第一个文件。
  4. 如果没有明确的操作,则会打印当前输入行。
  5. 如果ctr为假,则第一个条件打印每个文件的第1行。
  6. 如果第二个条件不是文件的第一行,则会打印一行。
  7. 演示:

    $ printf '%s\n' hdr f1 f2 > f1.txt
    $ printf '%s\n' hdr g1 g2 > f2.txt
    $ printf '%s\n' hdr h1 h2 > f3.txt
    $ awk 'FNR==1&&!ctr++;FNR!=1' *.txt
    hdr
    f1
    f2
    g1
    g2
    h1
    h2
    

    一个稍微简单的命令:

    awk '!ctr++ || FNR!=1' *.txt
    
    如果ctr为零(仅对第一个文件的第一行为true)或该行不是文件的第一行,则

    打印一行。

答案 1 :(得分:0)

试试这个,它可能适合你:

sed -e '2,${/^YOUR_HEADER/d' -e '}' *.txt > all.txt