【问题标题】:extracting values from text file using awk使用 awk 从文本文件中提取值
【发布时间】:2012-12-12 00:11:50
【问题描述】:

我有 100 个如下所示的文本文件:

File title
4
Realization number
variable 2 name
variable 3 name
variable 4 name
1   3452  4538   325.5

第 7 行 (1) 的第一个数字是实现编号,它应该与文件名相关。即,第一个文件称为 file1.txt,实现编号为 1(如上所示)。第二个文件名为 file2.txt,第 7 行的实现编号为 2。 file3.txt 应该在第 7 行有实现编号 3,依此类推...

不幸的是,每个文件的实现=1,它们应该根据文件名递增。

我想从每个文件的第 7 行(3452、4538 和 325.5)中提取变量 2、3 和 4,并将它们附加到一个名为 summary.txt 的摘要文件中。

我知道如何从 1 个文件中提取信息:

awk 'NR==7,NR==7{print $2, $3, $4}' file1.txt

哪个,正确地给了我:

3452 4538 325.5

我的第一个问题是,当从 bash 脚本对多个文件运行时,此命令似乎不会给出相同的结果。

#!/bin/bash    
for ((i=1;i<=100;i++));do
    awk 'NR=7,NR==7{print $2, $3, $4}' File$((i)).txt
done

当我使用上述脚本时,我在屏幕上打印了多行。

其次,我想将这些值与正确的先前实现编号一起输出到摘要文件中。即我想要一个看起来像这样的文件:

1  3452  4538  325.5
2  4582  6853  158.2
...
100  4865 3589  15.15

感谢您的帮助!

【问题讨论】:

    标签: bash unix awk


    【解决方案1】:

    你可以简化一些事情并得到你想要的结果:

    #!/bin/bash    
    
    for ((i=1;i<=100;i++))
    do
        echo $i $(awk 'NR==7{print $2, $3, $4}' File$i.txt)
    done
    

    您真的不想分配给 NR=7(就像您所做的那样),也不需要重复 NR==7,NR==7。当$i 足够时,你也真的不需要$((i)) 符号。

    如果所有文件的长度正好是 7 行,您可以在一个 awk 命令中完成所有操作(而不是 100 个):

    awk 'NR%7==0 { print ++i, $2, $3, $4}' Files*.txt
    

    【讨论】:

    • 谢谢。第一点实际上对我不起作用。我得到了替换错误或语法错误或其他东西。但是,第二个 1 行命令对我来说效果很好。谢谢!
    • 这很奇怪;我可以看到遇到问题的唯一方法是如果您实际上没有 100 个文件。我尝试了 10 个文件,它似乎在 Bash 3.2 和 4.2 上都可以正常工作。但是,我很高兴单线工作。反正它更整洁。
    【解决方案2】:

    请注意,您的 bash 脚本中只有一个 =。所有文件都正好有 7 行吗?如果您只对第 7 行感兴趣,那么:

    #!/bin/bash    
    for ((i=1;i<=100;i++));do
        awk 'NR==7{print $2, $3, $4}' File$((i)).txt
    done
    

    由于您的实现编号从 1 开始,您可以使用 nl 命令简单地添加它。

    例如,如果您的 bash 脚本名为 s.sh,则:

    ./s.sh | nl > summary.txt
    

    将在summary.txt 中为您提供预期行的结果

    【讨论】:

      【解决方案3】:

      这是使用awk的一种方式:

      awk 'FNR==7 { print ++i, $2, $3, $4 > "summary.txt" }' $(ls -v file*)
      

      -v 标志只是按版本号对 glob 进行排序。如果您的ls 版本不支持此标志,请尝试:ls file* | sort -V

      【讨论】:

        猜你喜欢
        • 2012-06-09
        • 2012-08-18
        • 1970-01-01
        • 2020-12-15
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        相关资源
        最近更新 更多