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

Bash 使用awk从目录中的所有文本文件中提取特定行,bash,awk,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个文件中的每个文件上循环

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

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

for files in *; do awk '{if(NR==1) print NR, $0}' *.txt; done > result.txt
当我运行命令时,result.txt文件包含50行,但它们都来自目录中的单个文件,而不是每个文件一行。公共文件似乎在单个文件上循环50次,而不是在50个文件中的每个文件上循环


如果有人能帮助我理解我的错误所在,我将不胜感激。

为什么不使用head?例如,查找:

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

为什么不用头呢?例如,查找:

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
试试这个-

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

试试这个-

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


您的代码有两个问题:

  • 您有一个在
    *
    上迭代的外部循环,但您的循环体不使用
    $files
    。也就是说,您正在调用
    awk'…'*.txt
    50次。这就是为什么awk的任何输出在
    result.txt
    中重复50次的原因

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

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

    一个可能的解决方案:

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

    您的代码有两个问题:

  • 您有一个在
    *
    上迭代的外部循环,但您的循环体不使用
    $files
    。也就是说,您正在调用
    awk'…'*.txt
    50次。这就是为什么awk的任何输出在
    result.txt
    中重复50次的原因

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

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

    一个可能的解决方案:

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

    太好了,非常感谢你们两位。这两种解决方案都非常有效,非常感谢你们两位。这两种解决方案都很有效