광산에는 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
공백이나 탭으로 구분된 패턴인 두 번째 파일( )이 있습니다.
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