두 개의 파일이 있습니다.
파일 1(9월 = 탭):
A1 bla blo bli 23 blp
A1 bla blo bli 21 blp
A1 bla blo bli 28 blp
B2 bla blo bli 32 blp
B2 bla blo bli 31 blp
B2 bla blo bli 35 blp
파일 2(9월 = ;
):
fli;flo;A1;flu;flc
fli;flo;A2;flu;flc
fli;flo;B1;flu;flc
fli;flo;B2;flu;flc
필드 1의 동일한 값에 해당하는 파일 1의 5번째(숫자) 필드의 모든 값 목록을 파일 2의 행에 추가하고 싶습니다. 여기서 세 번째 필드는 파일 1의 첫 번째 필드와 같습니다. 같은. 위의 입력 예에서 원하는 출력은 다음과 같습니다.
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35
awk
이 작업을 수행하기 위한 명령(또는 기타) 이 있습니까 ?
몇 가지 테스트를 수행했지만 FNR==NR
아직 시작하지 않았습니다.
미리 감사드립니다
답변1
awk
다음 명령을 사용하여 작업을 수행 할 수 있어야 합니다 .
awk -F"\t" 'FNR==NR{if ($1 in a) {a[$1]=a[$1] ";" $5} else {a[$1]=$5}} \
NR>FNR{split($0,f,";"); $0=$0 ";" a[f[3]]; print}' file1 file2
(가독성을 높이기 위해 두 줄로 나눕니다.)
이는 먼저 file1
파일( 로 표시)을 읽고 처리할 때 동일한 값 에 해당하는 모든 값을 누적하는 FNR == NR
매핑 테이블을 생성합니다 .a
$5
$1
두 번째 파일( NR>FNR
)이 처리되고 테이블에 a
세 번째 세미콜론으로 구분된 필드 값에 대한 항목이 포함되면 해당 값이 행에 추가됩니다.
"파일별 필드 구분 기호"를 지정할 수 없으므로 -F
선택한 명령줄 인수는 탭으로 구분된 첫 번째 파일에 대해 정확합니다. 이는 두 번째 파일을 처리할 때 함수를 사용하여 "수동으로" 분할을 수행 하고 결과를 다른 배열에 저장한 다음 split()
대신 를 통해 f
해당 항목(=필드)에 액세스해야 함을 의미합니다.f[number]
$number
(고쳐 쓰다나는 Stalin Vignesh Kumar의 답변에서 다음과 같이 말한 내용을 수정했습니다. 결국 파일당 필드 구분 기호를 지정할 수 있습니다. )
귀하의 예제 입력에 대해 나는 얻습니다.
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35
답변2
$ awk 'FNR==NR{ a[$1]=a[$1]";"$5;next }{sub(";","",a[$3]);print $0";"a[$3]}' file FS=";" file1
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35
답변3
$ awk 'NR==FNR{a[$1]=($1 in a ? a[$1] OFS : "") $5; next} {print $0, a[$3]}' OFS=';' file1 FS=';' file2
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35
답변4
BEGIN
이 블록은 값에서 작성된 각 값의 접두사를 포함하는 배열을 만듭니다 .$1
$5
코드 줄
$ awk 'BEGIN { while ( (getline <"input.1") > 0) { a[$1]=a[$1] ";" $5; }; FS=";" }; '\
'{ if (a[$3]=="") a[$3]=";"; print $0 a[$3]; }' input.2
fli;flo;A1;flu;flc;23;21;28
fli;flo;A2;flu;flc;
fli;flo;B1;flu;flc;
fli;flo;B2;flu;flc;32;31;35