鉱山には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_2
。file_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.のコメントを参照してください。)
答え2
これはマクロプロセッサに適した作業ですm4
。
マクロ名 -名前は文字、数字、および文字(アンダースコア)の順序で、
_
最初の文字は数字ではありません。
m4 <<\EOF
patsubst(include(`file_2'), `\(\S+\)\s+\(\S+\)', `define(`\1', `\2')dnl')dnl
include(`file_1')dnl
EOF
出力:
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
ただし、最後の数字以外のパターンで部分一致を実行する必要がある場合は、GNU AWKを使用することをお勧めします。
awk '
NR==FNR && sub(/[0-9]+$/,"", $1) \
{A[$1] = $2; next}
{for(i in A) gsub(i"[0-9]+", A[i])}
1' file_2 file_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 EC 70.4117
CI SA 99.9985