awkとsedを使用してファイルモードでファイルに置き換える

awkとsedを使用してファイルモードでファイルに置き換える

鉱山にはfile_1タブまたはスペースで区切られた3つの列があります。

Hhhg_2345_4567_33678    Hhhg_2345_4567_33678    97.0376
Hhhg_2345_4567_33679    Tyre_56576_567_899  70.4077
Hhhg_2345_4567_33680    Jyu_679__89090  79.0189
Hhhg_2345_4567_33681    abc_tyhiulo_89098   97.139
Hhhg_2345_4567_33682    gui_tyu_5678_4567   70.3177
Tyre_56576_567_899  abc_tyhiulo_89098   70.3442
Tyre_56576_567_900  Hhhg_2345_4567_33678    70.4117
Tyre_56576_567_901  Jyu_679__89090  99.9985

file_2スペースまたはタブ区切りのパターンである2番目のファイル()があります。

Hhhg_2345_4567_33678    EC
Tyre_56576_567_899  CI
Jyu_679__89090  SA

私が望むのは、文字列を置き換えるコマンドを作成することですfile_2file_1したがって、出力は次のようになります。

EC  EC  97.0376
EC  CI  70.4077
EC  SA  79.0189
EC  abc_tyhiulo_89098   97.139
EC  gui_tyu_5678_4567   70.3177
CI  abc_tyhiulo_89098   70.3442
CI  Hhhg_2345_4567_33678    70.4117

私はこれを試しました:

sed '/^[^ ]* [^ ]*$/{H;d;};G;s/ \([^ ]*\)\n.*\n\1 \([[:print:]]*\).*/ \1   \2/;P;d' file2 file1

しかし、うまくいきません。

ベストアンサー1

このawkプログラムを試してください。

文書:pattern.awk

# Store "file 2" (the first on command line)
NR == FNR {
    h[$1] = $2
    next
}
# Check "file 1" (the second on command line)
h[$1] != "" {
    $1 = h[$1]
}
h[$2] != "" {
    $2 = h[$2]
}
{
    print
}

次のコマンドラインを使用してください(警告、ファイルの順序は非常に重要です)。

awk -f pattern.awk file2 file1

出力は次のとおりです。

EC EC 97.0376
Hhhg_2345_4567_33679 CI 70.4077
Hhhg_2345_4567_33680 SA 79.0189
Hhhg_2345_4567_33681    abc_tyhiulo_89098   97.139
Hhhg_2345_4567_33682    gui_tyu_5678_4567   70.3177
CI abc_tyhiulo_89098 70.3442
Tyre_56576_567_900 EC 70.4117
Tyre_56576_567_901 SA 99.9985

(必要な出力は正確ではありません。Jim L.のコメントを参照してください。)

おすすめ記事