ファイルのヘッダーを解析し、ヘッダーに基づいてファイルの値を置き換えます。

ファイルのヘッダーを解析し、ヘッダーに基づいてファイルの値を置き換えます。

次のファイルがあります

Field1|Field2|Field3|Field4|Field5
a|b|c|d|e
1|2|3|4|5
z|y|x|w|v

2つの入力を許可するスクリプトがあります

script.sh Field3 T

script.shは「Field3」パラメータを使用し、その列番号に従って内容を「T」に置き換えます。

[編集する]

@Costasの次の提案を試しましたが、問題が発生しました。私のファイルは次のとおりです。

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2~Y~N~~0

次のスクリプトを実行すると

cat <filename> | awk -F'~' -v p='MODULE_ColumnD' -v r='99' 'NR==1{for (i=1;i<=NF;i++) if($i==p)f=i;print;next}$f=r'

値を変更しますが、次のように出力から区切り文字が見つからないか、スペースで置き換えられます。

MODULE_ColumnA~MODULE_ColumnB~MODULE_ColumnC~MODULE_ColumnD~MODULE_ColumnE
8.2 Y N 99 0

レコードから区切り文字を再取得するには?

答え1

awk -F'|' -v p='Field3' -v r='T' '
    NR==1{
        for (i=1;i<=NF;i++)
            if ($i==p)
               f=i
        print
        next}
    $f=r
'

使用する形式を指定するには、次のようにscript.awk保存します。

#!/usr/bin/awk -f
BEGIN{
    OFS=FS="|"}
NR==1{
    for (i=1;i<=NF;i++)
        if ($i==p)
            f=i
    print
    next}
$f=r

そして実行可能にして、次のように使用してくださいchmod +x script.awk

./script.awk p=Field4 r=T input.file

関連情報