IFS = 中を使用してファイルからフィールドを読み取り、フィールドを置き換える方法

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 

私はファイルから読み取られた2番目の値が文字列に変わり、変数を置き換えるのではなく、実際のファイル自体を変更する2番目の行を実行する方法を探しています。私はsed -iを使用すると思いますが、特にファイルに書き直さずにこれを行うより簡単な方法が何であるかわかりません。

ベストアンサー1

区切り文字がある単純な形式のファイルには awk が便利な場合が多いです。

たとえば、入力ファイルが与えられると、各行foo.txtでコンマで区切られた2番目のフィールドが変更され、残りは変更されずに残り、変更されたファイルが印刷されます。

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

-v FS=,次に、-v OFS=,入力フィールドと出力フィールドの区切り文字をコンマに設定し、行の$2 = ...2番目のフィールドを変更します。すべての行を変更するには、NR == 2テストを削除するだけです。

1行(123行など)でのみこれを行う必要がある場合は、次のことができます。

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

私が「単純形式」と言ったことに注意してください。それがデータに引用符で囲まれたコンマが表示される可能性がある「カンマ区切り」形式の1つである場合、awkは適切なツールではありません。

おすすめ記事