4列の値に基づいて3列の値を変更する方法

4列の値に基づいて3列の値を変更する方法

次のファイルがありますtest.txt

000092;;;;2004;;;;N;;;;N

000098;;;;0086;;;;Y;;;;Y

3番目の列の値に基づいて4番目の列の値を更新したいと思います。 4列の値がある場合はN3列の値をに置き換えNA、4列の値がある場合はY3列の値をに置き換えますUPDATE

出力は次のようになります。

000092;;;;2004;;;;NA;;;;N

000098;;;;0086;;;;UPDATE;;;;Y

答え1

awk -F ';;;;' -v 'OFS=;;;;' '$4 == "Y" { $3 = "UPDATE" } $4 == "N" { $3 = "NA" } { print; }' test.txt

test.txt質問印刷で指定されているとおり

000092;;;;2004;;;;NA;;;;N
000098;;;;0086;;;;UPDATE;;;;Y

;;;;質問で言及されているように、実際には(単一のセミコロン)で区切られた13列の代わりに(4つのセミコロン)で区切られた4列のみがあるとします;。したがって、4つのグループの間に追加のデータを含む行がある場合、このスクリプトは機能しません;

説明する:

-F ';;;;'入力フィールド区切り記号の設定出力フィールド区切り記号設定
-v 'OFS=;;;;'条件
$4 == "Y":フィールド4の場合はいY
{ $3 = "UPDATE" }アクション:フィールド3修正
無条件アクションと同じ:(結果)行印刷NNA
{ print; }

答え2

awkを使用して最初に入力n出力フィールド区切り文字を設定し、入力データでyまたはnのみを含むレコードを見つけて変更し、最後にstdoutとして印刷します。

$ awk -F';;;;' '
    BEGIN{OFS=FS}
    $4 ~ /^[NY]$/{$3 = ($4 == "N") ? "NA" : "UPDATE"}1
' file

別のアプローチは次のとおりです。

$ awk -F';;;;' 'BEGIN{OFS=FS;a["N"]="NA";a["Y"]="UPDATE"}
  $4 ~ /^[NY]$/{$3 = a[$4]}1' file

関連情報