두 개의 파일이 있습니다: File1
ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11044 0.9626 688423261 2 01/04/2015 0.9983763305
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305
ARS-BFGL-BAC-11044 0.9626 688423263 2 01/04/2015 0.9983763305
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305
파일 2:
ARS-BFGL-BAC-10975 10 21225382
ARS-BFGL-BAC-11025 10 84516867
ARS-BFGL-BAC-11193 1 29303546
원하는 출력
ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305 1 29303546
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305 1 29303546
따라서 파일 1에는 파일 2보다 더 많은 행이 있습니다. 출력의 열 1을 기반으로 파일 2의 행만 유지하고 싶습니다.
Join을 시도했지만 작동할 수 없습니다. 내 파일이 정렬되지 않았다는 메시지가 표시됩니다.
join -j 1 -o 1.1,1.2,1.3,1.4,1.5,1.6,2.2,2.3 <(sort -k1 file1) <(sort -k1 file2)
가급적이면 awk 명령을 선호합니다. 파일 1은 매우 큽니다. 나는 열심히 노력했다
awk 'FNR==NR{a[$1]=$2 FS $3;next}{ print $0, a[$1]}' file2 file1 > output
어떤 도움이라도 대단히 감사하겠습니다. 감사해요
죄송합니다. 아래에 설명할 수는 없지만 파일을 명확히 하기 위해 파일 1의 열 1에 있는 모든 행이 파일 2에 있는 것은 아닙니다.
awk 명령
awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}'
파일 2의 줄 수만 유지됩니다. 그러나 이상적으로 내가 원하는 것은 예를 들어 ARS-BFGL-10975를 두 번(실제로는 더 많이) 반복하여 내 출력에 두 번 나타나는 것입니다.
지금까지 도와주셔서 감사합니다
답변1
샘플 데이터 사용:
$ join <(sort file1) <(sort file2)
ARS-BFGL-BAC-10975 0.9303 688423261 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-10975 0.9303 688423263 1 01/04/2015 0.9983763305 10 21225382
ARS-BFGL-BAC-11025 0.9092 688423261 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11025 0.9092 688423263 1 01/04/2015 0.9983763305 10 84516867
ARS-BFGL-BAC-11193 0.9544 688423261 1 01/04/2015 0.9983763305 1 29303546
ARS-BFGL-BAC-11193 0.9544 688423263 1 01/04/2015 0.9983763305 1 29303546
이것나타나다출력의 행 순서(여기에 정렬되어 있으므로 이것이 귀하에게 중요한지는 모르겠습니다) 외에도 원하는 작업을 수행할 수 있습니다.
기본 조인 필드는 첫 번째 필드이므로 -j 1
필요하지 않습니다(GNU join
확장입니다).
기본 출력 join
: "각 출력 줄은 연결된 필드, file1의 나머지 필드, file2의 나머지 필드로 구성됩니다."(fromOpenBSD 매뉴얼). 이는 사용하는 출력 필드 사양이 기본 동작과 일치하므로 필요하지 않음을 의미합니다.
의 경우 sort
기본값 -k1
과 동일합니다.
실수로 사용한 것 외에 표시되는 오류 메시지의 원인이 무엇인지 모르겠습니다 sort -c
.
답변2
awk 명령의 경우 file1의 키가 이미 file2에 표시되는지 확인하는 것이 누락되었습니다.
awk 'FNR==NR{a[$1]=$2 FS $3;next} $1 in a {print $0, a[$1]}' file2 file1 > output
# ................................^^^^^^^