길이가 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로 시작 ^
하고 grep
not을 사용하여 fgrep
핵심인 줄의 시작 부분과만 일치하도록 하는 것이 더 낫습니다. 그러나 md5sum과 같은 것이라면 잘못된 일치 가능성은 희박합니다. (그리고 나는 게으르다 :-))