예를 들어 열별로 콘텐츠를 출력하는 두 가지 다른 명령이 있다고 가정해 보겠습니다.
$ 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,c
command_2
x,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입니다.