Awk Bash:从目录中读取.txt文件,添加列记录并将其附加到同一文本文件中

Awk Bash:从目录中读取.txt文件,添加列记录并将其附加到同一文本文件中,awk,Awk,我从一个目录中得到了.txt文件。读取每个文件并添加列记录,然后将其追加到同一个.txt文件中。 我尝试使用awk命令编写代码,但发现其中有一些错误。帮我解决这个问题。谢谢 for file in *. txt; do awk - F' ' {$2+$3=var} >> "$file" done 我想在同一个命令中同时读取和写入文件不是一个好主意。我会把这些步骤分开 如果在shell中使用awk脚本,则输出可以临时存储在变量中。(临时文件也是一个选项。) 注: 我无法解释{

我从一个目录中得到了.txt文件。读取每个文件并添加列记录,然后将其追加到同一个.txt文件中。 我尝试使用awk命令编写代码,但发现其中有一些错误。帮我解决这个问题。谢谢

for file in *. txt; do
   awk - F' ' {$2+$3=var} >> "$file" 
done

我想在同一个命令中同时读取和写入文件不是一个好主意。我会把这些步骤分开

如果在shell中使用awk脚本,则输出可以临时存储在变量中。(临时文件也是一个选项。)

注:

  • 我无法解释
    {$2+$3=var}
    的意思。我假设它应该是
    var=$2+$3
    ,其中
    var
    表示结果。(这只是猜测。)

  • 我使用
    $()
    将所附命令的标准输出重定向到一个字符串中,该字符串又可以分配给变量

  • awk脚本必须被引用(最好是单引号),因为
    $2
    $3
    可能会被bash本身意外地解释(从而使awk脚本出错)

  • 空格是默认的字段分隔符–无需提及。如果您的文本文件是以制表符分隔的,则应表示为(例如
    awk-F“\t”

  • 但是,也许,我完全错了。可能是,您希望添加一列,其中包含每个响应的总和。线(由于您没有提供示例输出,我对此不清楚。)在这种情况下,awk脚本必须稍微更改:

    #/bin/bash
    for FILE in *.txt; do
      # process file
      OUTPUT=$(awk '{ print $0" "($2 + $3) }' "$FILE")
      # make a backup (or comment next line if you prefer cold showers)
      mv "$FILE" "$FILE".bak
      # overwrite file with patched version
      echo "$OUTPUT" > "$FILE"
    done
    
    注:

    制表符分隔文件的命令为:
    awk-F“\t”{print$0”\t“($2+$3)}'”$FILE”

    最后,一般性说明:

    修改原始文件有点危险。这确实意味着在同一组文件上重复执行bash脚本(前者和后者)将一次又一次地修改文件(可能会产生意外的结果)。因此,我总是喜欢使用新名称创建文件(例如,使用附加后缀)。如果需要保留原始文件名,我会在使用相同名称编写新文件之前重命名原始文件(例如,使用附加后缀
    .bak
    )。因此,可以通过以下方式轻松撤销意外结果:

    $ for FILE in *.txt.bak; do mv "${FILE}" "${FILE/\.bak/}" ; done
    

    您没有发布输入和最终结果。为什么?File1.txt 10 20 200什么是
    var
    $ for FILE in *.txt.bak; do mv "${FILE}" "${FILE/\.bak/}" ; done