【问题标题】:Awk only works on final fileawk 仅适用于最终文件
【发布时间】:2017-07-09 00:18:25
【问题描述】:

我正在尝试使用以下循环处理许多 .csv 文件:

for i in *.csv
do
    dos2unix $i
    awk '{print $0, FILENAME}' $i>new_edit.csv
done

此脚本应将文件名附加到每个文件的末尾,并且它可以工作。但是,查看输出 new_edit.csv 仅包含来自输​​入的 .csv 文件之一的数据。

wc -l new_edit.csv

表示我的 awk 只处理我的一个 csv 文件中的行。如何让我的 awk 处理每个文件?

【问题讨论】:

  • 查看 new_edit.csv 中的输出,我怀疑它被覆盖而不是附加到文件中,因为它只是似乎在其中的最后一个文件,但我不确定....
  • 没错。应该是... $i >> new_edit.csv
  • @JamesBrown 您的评论解决了我的问题。您可以将其发布为答案以便我接受吗?
  • 我明白了,它消除了对 for 循环的需要。
  • 你也可以简单地设置RS,然后也不需要子命令

标签: bash csv parsing awk


【解决方案1】:

您应该使用>> 作为附加重定向器,而不是使用>。您还可以将整个代码替换为:

$ awk '{sub(/\r/,"",$NF); print $0, FILENAME}' *.csv > new_edit.csv

【讨论】:

    【解决方案2】:

    以下程序应该可以帮助您: 因为您使用的是重定向运算符 > ,它总是覆盖文件中的内容。如果我们将其替换为附加重定向操作符>>,它将处理所有文件并将内容附加到新文件中

    #!/bin/bash
    
    for i in *.csv
    do
              awk '{print $0, FILENAME}' $i>>new_edit.csv
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-03
      • 2012-04-20
      • 2018-09-08
      • 2021-04-18
      • 2016-04-20
      • 2014-12-09
      相关资源
      最近更新 更多