2017-06-15 46 views
-2

我从目录中获得.txt文件。读取每个文件并添加列记录并将其附加到相同的.txt文件中。 我试图用awk命令编写代码,但是我看到它有一些错误。帮我解决它。谢谢!Bash:从目录中读取.txt文件并添加列记录并将其追加到同一个文本文件中

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

您没有发布输入和最终结果。为什么? – RomanPerekhrest

+0

File1.txt 10 20 200 – Adarsh

+0

什么是'var'? – RomanPerekhrest

回答

0

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

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

#/bin/bash 
for FILE in *.txt; do 
    # process file 
    OUTPUT=$(awk '{ printf " %s", $2 + $3 }' "$FILE") 
    # add results to file 
    echo "$OUTPUT" >> "$FILE" 
done 

注:

  1. 我不能interprete什么{$2+$3=var}是指。我认为它应该是var=$2+$3其中var表示结果。 (这只是猜测。)

  2. 我用$()所述封闭命令的标准输出重定向到其又可以被分配给一个变量的字符串。

  3. awk脚本必须被引用(最好带单引号),因为$2$3可能会被bash本身意外解释(从而导致awk脚本错误)。

  4. 该空间是默认字段分隔符–没有必要提及它。相反,如果您的文本文件是制表符分隔的,则应标明(例如awk -F"\t")。

但是,可能是,我让你完全错了。可能是,你想添加一个列与每个resp的总和。线。 (由于您没有提供样本输出不清楚这个对我来说)。在这种情况下,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 
相关问题