기둥을 수평으로 연결합니다. 첫 번째 열과 교차하는 행만 인쇄

기둥을 수평으로 연결합니다. 첫 번째 열과 교차하는 행만 인쇄

예를 들어 열별로 콘텐츠를 출력하는 두 가지 다른 명령이 있다고 가정해 보겠습니다.

$ command_1

7049857 abc fdg hsi
5409858 xxx fyy hsi
540958  abc zzz hsi
54230956  rbc sss hsi

$ command_2

7049857 0 fdg free
5409858 0 fyy free
540958  2 zzz free

x,y,z출력에서 인덱스가 있는 열을 자동으로 가져오고 index: 을 사용하여 새 출력을 인쇄하고 싶습니다 command_1.a,b,ccommand_2x,y,z,a,b,c

예:

출력 열1그리고2From : 및 : commmand_2의 마지막 열command_1

$ new_command

7049857 0  hsi
5409858 0  hsi
540958  2  hsi

내가 지금까지 가지고 있는 것:

나는 비교를 처음 접했지만 awk다음을 사용하여 각 명령에서 해당 열을 얻을 수 있다는 것을 알고 있습니다 awk.

command_1 | awk '{print $x " " $y " " $z}'
command_2 | awk '{print $a " " $b " " $c}'

위의 내용은 세로로 기둥을 연결한 것인데 가로로 연결해야 합니다.

첫 번째 열과 교차하는 행만 인쇄합니다.

가정된 행의 수는 command_2더 많거나 적을 수 있습니다 command_1. 그러나 두 명령의 첫 번째 열에는 다음이 포함됩니다.동일한 카테고리에 속하는 항목 (위 예시와 같이 여러 자리 ID)

따라서 두 명령의 첫 번째 열이 동일하게 정렬되고 새 항목이나 누락된 항목이 마지막에만 발생할 수 있다고 가정하면 command_1합계 항목이 있는 행 command_2(즉, 두 명령 모두)만 인쇄되도록 어떻게 보장할 수 있을까요? (위의 예는 이를 보여줍니다)

답변1

다음과 같이 시도해 보세요.

join <(command1) <(command2) | cut -d ' ' -f 1,5,4

join명령은 명령이 아닌 파일을 허용하지만 bash와 같은 셸을 사용하면 표시된 구조를 사용하여 명령 출력을 가상 파일로 변환할 수 있습니다.

원한다면 cut그것도 사용할 수 있습니다 .awk

이 작업을 자주 수행한다면 관계형 데이터베이스 엔진 사용을 고려해 보세요.

답변2

awk를 원한다면 다음 중 하나를 사용하세요.

awk '
  NR==FNR {cmd1[$1] = $NF; next}
  $1 in cmd1 {print $1, $2, cmd1[$1]}
' <(command_1) <(command_2)

awk FNR변수는 현재 파일의 줄 번호입니다.
NR변수는 지금까지 본 모든 라인의 라인 번호입니다.
따라서 조건은 NR==FNR첫 번째 파일 매개변수에 대해서만 true입니다.

관련 정보