다음과 같은 두 개의 텍스트 파일이 있습니다.
ㅏ
1111|100|11/11/1111|a
2222|200|11/11/1111|a
3333|300|11/11/1111|a
4444|400|11/11/1111|a
두번째
1111|100|11/11/1111|a
1111|100|11/11/1111|a
2222|200|11/11/1111|a
3333|300|11/11/1111|a
5555|500|11/11/1111|a
나는 다음 명령을 사용했습니다
awk -F"|" '{ printf "%4s|%3s|\n",$1,$2 }' a | grep -v -f /dev/stdin b
어떤 출력....
5555|500|11/11/1111|a
예상 출력은 다음과 같습니다.
1111|100|11/11/1111|a
5555|500|11/11/1111|a
어떻게 해야 하나요 grep
?awk
답변1
grep
실제로 파일을 비교하는 대신 특정 형식의 정규식과 일치하는 개별 줄을 추출하는 데 사용되므로 여기에는 적합하지 않습니다. 하나의 일치 항목을 반환하지 못하고 다른 일치 항목(파일의 처음 두 줄 b
)을 삭제합니다.
당신이 사용할 수있는 comm
:
$ comm -13 a b
1111|100|11/11/1111|a
5555|500|11/11/1111|a
이는 comm
정렬된 입력 데이터에 의존합니다.
comm
위 명령은 -13
기본 출력의 첫 번째 및 세 번째 열을 삭제합니다. 기본적으로 첫 번째 파일의 열 1에 있는 줄만 출력하고, 두 번째 파일의 열 2에 있는 줄만 출력하며, 마지막 열의 공통 줄만 출력합니다(설명서 comm
기본 사례 참조, 첫 번째 파일에 있는 줄만 출력합니다). 1열의 파일, 2열의 두 번째 파일에만 있는 줄, 마지막 열의 공통 줄(참조:표준 유틸리티):
$ comm a b
1111|100|11/11/1111|a
1111|100|11/11/1111|a
2222|200|11/11/1111|a
3333|300|11/11/1111|a
4444|400|11/11/1111|a
5555|500|11/11/1111|a
답변2
배열 배열에 대해 GNU awk 및 ARGIND를 사용하여 정렬되지 않은 파일 수를 비교하는 보다 일반적인 방법:
$ cat tst.awk
BEGIN { OFS="\t" }
{ cnt[$0][ARGIND]++ }
END {
for (str in cnt) {
for (fileNr=1; fileNr<=ARGIND; fileNr++) {
printf "%d%s", cnt[str][fileNr], OFS
}
print str
}
}
$ awk -f tst.awk a b
1 2 1111|100|11/11/1111|a
1 1 2222|200|11/11/1111|a
1 1 3333|300|11/11/1111|a
1 0 4444|400|11/11/1111|a
0 1 5555|500|11/11/1111|a
위의 내용은 주어진 문자열이 첫 번째 파일에 나타나는 횟수, 두 번째 파일에 나타나는 횟수 등과 함께 모든 파일의 각 고유 문자열을 보여줍니다.
원하는 결과를 얻으려면 다음을 수행하면 됩니다.
$ awk -f tst.awk a b | awk '$2>$1' | cut -f3-
1111|100|11/11/1111|a
5555|500|11/11/1111|a