繁体   English   中英

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

[英]Using awk to extract specific line from all text files in a directory

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

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

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

当我运行命令时,result.txt文件包含50行,但是它们全部来自目录中的单个文件,而不是每个文件中的一行。 共同点似乎是循环了50次,而不是循环了50次。

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

尝试这个 -

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

要么

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

您的代码有两个问题:

  1. 您有一个循环遍历*的外循环,但是您的循环主体不使用$files 也就是说,您要调用awk '...' *.txt 50次。 这就是为什么awk的任何输出在result.txt重复50次的原因。

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

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

可能的解决方法:

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

为什么不使用头? 例如,使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM