파일에 역행이 있는 경우 파일에서 해당 행을 삭제하는 명령

파일에 역행이 있는 경우 파일에서 해당 행을 삭제하는 명령

다음과 같은 CSV가 있다고 말할 수 있습니다.

1,20
1,13
20,1

1,20이 이미 csv에 있으므로 20,1을 삭제해야 합니다. 내 생각은 역방향 내용이 이미 csv에 있는지 한 줄씩 확인하는 것이지만 쉘 스크립트를 사용하여 이 작업을 수행하는 방법을 모르겠습니다.

편집: 2개의 같은 숫자는 같은 줄에 있을 수 없습니다. 예를 들어 20,20은 절대 나타나지 않습니다.

답변1

이를 합리적인 속도로 달성하려면 일종의 해시 테이블이 필요합니다. 전통적으로는 이 작업을 수행 awk하지만 bash연관 배열을 포함하여 모든 최신 스크립트 언어에서 이 작업을 수행할 수 있습니다.

awk 'BEGIN{FS=","}                                                                   
{                                                                               
   rev=$NF; for(i=NF-1;i>0;i--) {rev = rev "," $i}                                                                         
   if (!seen[rev]) { print }                                                    
   seen[$0]=1                                                               
}'

이것은 rev에 역행을 구성하고, 아직 본 적이 없다면 역행을 인쇄한 다음, 본 것을 기록합니다.

답변2

$ cat file
4,bumblebee
1,20
1,13
20,1
20,1
20,13
bumblebee,3
13,1
bumblebee,4
$ awk -F, '!seen[$1,$2]++ && !seen[$2,$1]' file
4,bumblebee
1,20
1,13
20,13
bumblebee,3

seen이는 입력에서 필드 쌍이 표시되는 횟수를 계산하는 연관 배열을 사용하여 수행됩니다 .

이전에 해당 쌍이나 반대 쌍을 본 적이 없다면 해당 줄을 인쇄하세요.

이는 필드가 숫자라고 가정하지 않습니다.

답변3

실제로 원하는 부분이 순서에 관계없이 특정 부분 조합이 한 번만 나타나도록 하는 것이라고 가정할 때, 관용적인 접근 방식은 고유하게 만들고 싶은 부분을 특정 순서로 정렬한 다음 그 결과가 나타나는지 확인하는 것입니다. 키는 이전에 본 적이 있습니다. 부품이 2개만 있으면 다음과 같습니다.

$ awk -F',' '!seen[$1>$2 ? $1 FS $2 : $2 FS $1]++' file
1,20
1,13

관련 정보