如何使用 while IFS= 从文件中读取字段,然后替换该字段

如何使用 while IFS= 从文件中读取字段,然后替换该字段
while IFS=, read -r Q1 Q2 Q3 Q4; do #Reading from a CSV file
Replace Q2 with the string "Nan"    #Replace the second comma separated value with a string 

我正在寻找如何执行第二行,其中从文件读取的第二个值然后替换为字符串,并且它更改实际文件本身,而不仅仅是替换变量。我想我将使用 sed -i 但不确定在不专门再次写入文件的情况下执行此操作的更简单方法是什么。

答案1

对于带有分隔符的简单格式的文件,awk 通常很方便。

例如,给定输入文件foo.txt,这将更改每行上的第二个逗号分隔字段,保持其余部分不变并打印修改后的文件。

$ awk -F, -v OFS=, '{ $2 = "Nan"; print }' < foo.txt
a,Nan,c,d
e,Nan,g,h

-v FS=,并将-v OFS=,输入和输出字段分隔符设置为逗号,并$2 = ...修改该行的第二个字段。如果要对所有行进行更改,可以删除该NR == 2测试。

如果您只需要在一行(例如第 123 行)上执行此操作,您可以执行以下操作:

$ awk -F, -v OFS=, -v line=123 'NR == line { $2 = "Nan" } { print }' < foo.txt

请注意,我说的是“简单格式”,如果它是数据中可以出现引号逗号的“逗号分隔”格式之一,那么 awk 不是您的工具。

答案2

在普通的 bash 中,你可以这样做(它既慢又不知道 CSV 的细节)

while IFS=, read -r q1 q2 q3 q4; do
    echo "$q1,NaN,$q3,$q4"
done < inputFile > outputFile

ln inputFile inputFile.bak   # backup input file
mv outputFile inputFile      # overwrite input file

使用其他工具,您可以获得性能和安全性:

ruby -rcsv -e '
  CSV.foreach(ARGV.shift) {|row| row[1] = "NaN"; puts CSV.generate_line row}
' infile > outfile

相关内容