고유한 체크섬이 있는 행

고유한 체크섬이 있는 행

길이가 n인 줄을 포함하는 파일 A가 있습니다. A의 각 행에 대해 길이가 n인 행과 해당 키를 출력하는 프로그램이 있습니다. 프로그램은 A의 각 라인에 대한 키 시퀀스를 파일 B에 쓰거나 A의 각 라인에 대해 stdout에 쓸 수 있습니다.

개별 키가 중복되지 않도록 A의 모든 행을 가져와야 합니다. 이를 달성하는 가장 효율적인 방법은 무엇입니까? -k 옵션이 있지만 정확히 내가 원하는 작업을 수행하지 않는 것 같습니다.

편집하다.댓글에 대한 설명.

A에 다음 줄이 포함되어 있다고 가정합니다.

foo
bar 
baz

두 번째 프로그램은 다음 줄에 대한 주요 출력을 계산합니다.

xxx
yyy
xxx

첫 번째 줄은 foo의 출력이고, 두 번째 줄은 bar의 출력이고, 세 번째 줄은 baz의 출력입니다.

그러면 올바른 출력 중 하나는 다음과 같습니다.

foo
bar

답변1

귀하가 지정한 대로(그러나 귀하의 질문에 대한 wurtel의 의견을 고려하십시오):

generate_keys A > B   # adjust this call however that program is defined to work

awk '
  NR==FNR { a[NR]=$1 ; next }
  !b[$1]++ { print a[FNR] }
' A B

답변2

일부 샘플 데이터 없이는 테스트할 수 없지만 다음과 같습니다.

paste <(generate-keys "$filename") "$filename" |
awk '! seen[$1]++ {print $2}'

답변3

$ getkeys A > B
$ sort B | uniq -c | awk '{if($1 == 1) print $2}' > C
$ paste B A | fgrep -f C | cut -f2-

설명하다:

먼저 각 행에 대한 키를 생성합니다.

그런 다음 각 키가 나타나는 횟수를 세고 한 번 나타나는 키를 파일 C에 저장합니다.

그런 다음 paste이 행을 고유 키 목록과 일치시킨 fgrep다음 해당 행만 선택하는 데 사용합니다(키 생략) cut.

C의 문자열이 a로 시작 ^하고 grepnot을 사용하여 fgrep핵심인 줄의 시작 부분과만 일치하도록 하는 것이 더 낫습니다. 그러나 md5sum과 같은 것이라면 잘못된 일치 가능성은 희박합니다. (그리고 나는 게으르다 :-))

관련 정보