Grepping 정확한 차이

Grepping 정확한 차이

다음과 같은 두 개의 텍스트 파일이 있습니다.

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

관련 정보