使用awk从目录中的所有文本文件中提取特定行

时间:2017-02-24 15:52:37

标签: bash awk

我有一个包含50个文本文件的文件夹,我想在命令行中从每个文件中提取第一行,然后将其输出到result.txt文件。

我在包含我正在使用的文件的目录中使用以下命令:

for files in *; do awk '{if(NR==1) print NR, $0}' *.txt; done > result.txt

当我运行该命令时,result.txt文件包含50行,但它们都来自目录中的单个文件,而不是每个文件一行。常见的似乎是循环50次而不是50个文件中的每一个。

如果有人能帮助我理解我在哪里出错,我将不胜感激。

3 个答案:

答案 0 :(得分:3)

试试这个 -

for i in *.txt;do head -1 $i;done > result.txt

OR

for files in *.txt;do awk 'NR==1 {print $0}'  $i;done > result.txt

答案 1 :(得分:3)

您的代码有两个问题:

  1. 你有一个外循环迭代*,但你的循环体并没有使用$files。也就是说,您要调用awk '...' *.txt 50次。这就是为什么来自awk的任何输出在result.txt中重复50次。

  2. 您的awk代码检查NR(到目前为止读取的行数),而不是FNR(当前文件中读取的行数)。 NR==1仅在第一个文件的开头才为真。

  3. 还有另一个问题:首先创建result.txt,因此它包含在*.txt中。为避免这种情况,请为其指定一个不同的名称(不会在.txt中结束)或将其放在不同的目录中。

    可能的解决办法:

    awk 'FNR==1 {print NR, $0}' *.txt > result
    

答案 2 :(得分:2)

为什么不用头?例如,使用find:

find midir/ -type f -exec head -1 {} \; >> result.txt

如果你想按照你的方法,你需要指定文件,而不是使用通配符与awk:

for files in *; do awk '{if(NR==1) print NR, $0}' "$files"; done > result.txt