다음과 같은 입력 파일이 있습니다.
입력 파일 예:
a|a1|a2|a3|a4|a5|...|a29|$2342
a|a1|a2|a3|a4|a5|...|a29|$2343
a|a1|a2|a3|a4|a5|...|a29|$2344
a|a1|a2|a3|a4|a5|...|a29|$2345
b|b1|b2|b3|b4|b5|...|b29|$100
c|c1|c2|c3|c4|c5|...|c29|$12
다른 파일의 데이터는 다음과 같습니다.
a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1
아래 설명된 대로 이 두 파일을 사용하여 최종 출력을 얻으려고 합니다.
a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2343|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2344|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2345|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1
이전 열 값을 비교할 수 #
있고 동일한 것으로 확인되면 두 번째 파일의 값을 첫 번째 파일에 추가할 수 있다고 생각했습니다.
답변1
이는 일반적인 작업입니다 awk
. 가능한 해결책은 다음과 같습니다.
awk '
NR==FNR {
match($0,/.*\$/)
pref = substr($0,RSTART,RLENGTH)
rest = substr($0,RSTART+RLENGTH)
suff = substr(rest, index(rest,"|"))
suffixes[pref] = suff
next
}
{
match($0,/.*\$/)
prefix = substr($0,RSTART,RLENGTH)
match($0,/.*\$[0-9]+|/)
data = substr($0,RSTART,RLENGTH)
if (prefix in suffixes)
print data suffixes[prefix]
}
' file2 file1
file1
귀하의 질문에 "input file"이라는 파일은 어디에 있고 file2
귀하의 질문에 "another file"이라는 파일은 어디에 있습니까? (목록에 있는 파일의 순서를 참고하세요.)
설명하다:
첫 번째 명령 블록은 첫 번째 파일을 읽을 때 실행됩니다 file2
. 이는 NR==FNR
첫 번째 파일을 읽을 때만 참인 조건에 의해 달성됩니다. 두 번째 명령 블록은 두 번째 파일에 대해서만 실행됩니다 ( 첫 번째 명령 블록의 명령 file1
으로 인해 ). next
첫 번째 블록은 접두사 pref
와 접미사를 추출 suff
하고 suffixes[pref] = suff
각 접두사에 해당하는 접미사를 기억합니다. 이는 두 번째 블록의 데이터를 참조하는 데 필요합니다. 두 번째 블록에서는 유사한 명령이 실제로 실행되어 접두사를 추출하고 이를 사용하여 저장된 접미사에서 올바른 접미사를 가져옵니다. 한 가지 차이점이 있습니다. 기호 뒤의 숫자도 #
새 접두사 데이터의 일부로 유지해야 하므로 match
배열에 액세스하는 데 필요한 접두사 suffixes
와 결과 데이터의 일부가 되는 데 필요한 접두사를 구별하는 두 번째 작업이 있습니다.