(txt 파일에) 두 줄이 있다고 가정해 보겠습니다.
Monday, Tuesday, Week
Tuesday, Monday, Week
여기에는 동일한 정보가 포함되어 있지만 정보(첫 번째 열과 두 번째 열)가 각 행에서 다른 순서로 되어 있으므로 간단히 사용하거나 제거할 수는 sort
없습니다 uniq
.
동일한 정보가 포함된 중복 행을 모두 제거하려면 어떻게 해야 합니까?
답변1
그리고 perl
:
perl -lne 'print unless $seen{join ",", sort split /,\h*/}++'
답변2
파일에 표시되는 줄의 순서를 유지하는 데 신경 쓰지 않는다면 각 줄을 표준(또는 정식) 형식으로 지정한 다음 sort/uniq 또는 이와 유사한 방법을 사용할 수 있습니다.
파일에 표시된 순서 중 하나를 보존하는 데 관심이 있다고 추가했기 때문에 내가 취한 접근 방식은 각 줄을 정식 순서로 정렬하고 원래 줄과 함께 출력한 다음 다음과 같이 표시된 첫 번째 정규화된 줄을 정렬하는 것이었습니다. 키 및 중복 키가 있는 행이 제거된 다음 키가 잘립니다.
이것이 첫 번째 부분입니다. 각 원본 줄 앞에는 줄 내용의 정규화된 표현이 추가됩니다.
( while read f; do echo $f | tr -d "," | tr " " "\n" | sort | tr "\n" " " ; echo ':' $f ; done < data ) | awk -F":" '!_[$1]++' | cut -f2 -d: |cut -c2-
그 일부를 실행하여 그것이 무엇을 하는지 볼 수 있습니다. 첫 번째 부분은 : 구분 기호를 사용하여 정식 표현(어휘순으로 정렬)을 사용하여 원시 레코드를 내보냅니다.
$ cat data
Monday, Tuesday, Week
Tuesday, Monday, Week
Tuesday, Thursday, Week
Week, Thursday, Tuesday
$ ( while read f; do echo $f | tr -d "," | tr " " "\n" | sort | tr "\n" " " ; echo ':' $f ; done < data )
Monday Tuesday Week : Monday, Tuesday, Week
Monday Tuesday Week : Tuesday, Monday, Week
Thursday Tuesday Week : Tuesday, Thursday, Week
Thursday Tuesday Week : Week, Thursday, Tuesday
그런 다음 awk를 사용하여 키가 표시될 때마다 횟수를 포함하는 해시를 구축하고 "!"가 포함되지 않으므로 각 키의 첫 번째 인스턴스에 암시적 인쇄가 포함됩니다.
$ ( while read f; do echo $f | tr -d "," | tr " " "\n" | sort | tr "\n" " " ; echo ':' $f ; done < data ) | awk -F":" '!_[$1]++' | cut -f2 -d: |cut -c2-
Monday, Tuesday, Week
Tuesday, Thursday, Week
답변3
까다로운 솔루션(이것은 단지 예일 뿐임) - 내 bash에서 잘 작동합니다. 모든 줄/단어를 문자별로 분할한 다음 해당 문자를 정렬할 수 있습니다. 1행 정렬 = 2행 정렬이면 중복 항목이 있는 것입니다.
word1+=( $(echo "this is my life" |fold -w1) )
sortedword1=($(echo ${word1[@]} | tr " " "\n" | sort))
word2+=( $(echo "is this my life" |fold -w1) )
sortedword2=($(echo ${word1[@]} | tr " " "\n" | sort))
echo "${sortedword1[@]}"
echo "${sortedword2[@]}"
if [[ $sortedword1 == $sortedword2 ]]; then
echo "Word 1 and Word 2 are the same, delete one of them"
fi
산출:
e f h i i i l m s s t y
e f h i i i l m s s t y
Word 1 and Word 2 are the same, delete one of them