2017-02-24 60 views
1

我有一个包含50个文本文件的文件夹,我想从命令行中提取每个文件的第一行并将其输出到result.txt文件。使用awk从目录中的所有文本文件中提取特定行

我使用一个包含我的工作文件的目录中的以下命令:

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

当我运行的命令时,的Result.txt文件包含50条线,但他们都从目录中的单个文件而不是每个文件一行。常见的似乎是循环50次,而不是每个50个文件。

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

回答

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 
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 
+0

优秀,非常感谢你们。这两种解决方案都能起到一定的作用 – DanielH

3

您的代码有两个问题:

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

  2. 你AWK代码检查NR(读取行数到目前为止),不FNR(行数读当前文件内)。 NR==1只在第一个文件的开头才是真实的。

还有另外一个问题:result.txt首次创建,因此它被列入其中*.txt。为了避免这种情况,可以给它一个不同的名称(不以.txt结尾的名称)或将其放在不同的目录中。

一个可能的解决办法:

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