문자열과 설명이 포함된 탭으로 구분된 .csv가 있습니다. 이 같은:
strap tight
elba Island
foo bar
able Cain
parts buy
able Cain
먼저 탭 앞의 모든 항목의 길이를 기준으로 파일을 정렬합니다.
parts buy
strap tight
able Cain
able Cain
elba Island
few many
그런 다음 정확히 동일한 중복 항목을 제거합니다.
parts buy
strap tight
able Cain
elba Island
few many
그래도 삭제해야 해요단어 퍼즐중복—부분그리고줄자같은 글자를 가지고 있어요. 너무 너무엘바그리고유능한.
parts buy
able Cain
few many
대화 상자 경고를 에코합니다. 다음과 같습니다.
이 작업을 수행하는 최선의 방법에 대한 아이디어가 있습니까?
편집하다:
아래에 몇 가지 답변이 있습니다:
- 이는 Mac OS용입니다.
- 나는 1달러짜리 경기에만 관심이 있어요
- $1에는 대문자가 없습니다(그러나 $2에는 대문자가 있습니다).
- $1에는 중복된 문자가 없습니다.
이것은 내가 지금 사용하고 있는 코드입니다:
# print length+iii before every line
awk '{printf "%diii%s\n", length($1), $0}' < file.txt > /tmp/out && mv /tmp/out file.txt
# remove exact duplicates
sort -u < file.txt > /tmp/out && mv /tmp/out file.txt
# remove non-identical duplicates
# awk '{magic}' < file.txt > /tmp/out && mv /tmp/out file.txt
# varDupeEcho=remainder from above
# sort by size
sort -n -r -k1,1 < file.txt > /tmp/out && mv /tmp/out file.txt
#remove lengths
sed -i "" -E -e 's/^[0-9]+iii//' file.txt
# warn about duplicates
osascript -e "display dialog \"Duplicates found!\n\n$varDupeEcho\" --> Result: \{button returned:\"OK\"\}"
답변1
어떤 순서로든 값을 비교하는 일반적인 방법은 부분을 정렬하여 비교용 키를 만드는 것입니다. 예를 들어 "sorted_in"에 대해 GNU awk를 사용하고 문자열을 문자로 분할()하려면 null 세 번째 인수를 사용합니다.
$ cat tst.awk
BEGIN {
PROCINFO["sorted_in"] = "@val_str_asc"
OFS = "\t"
}
{
key = ""
split($1,chars,"")
for (i in chars) {
key = key tolower(chars[i])
}
print key, $0
}
$ awk -f tst.awk file | sort -k1,1 -u | cut -f2-
elba Island
strap tight
foo bar
명확한 그림을 얻기 위해 한 번에 한 단계씩 수행 중인 작업을 볼 수 있습니다.
$ awk -f tst.awk file
aprst strap tight
abel elba Island
foo foo bar
abel able Cain
aprst parts buy
abel able Cain
$ awk -f tst.awk file | sort -k1,1
abel able Cain
abel able Cain
abel elba Island
aprst parts buy
aprst strap tight
foo foo bar
$ awk -f tst.awk file | sort -k1,1 -u
abel elba Island
aprst strap tight
foo foo bar
귀하의 질문에 귀하가 MacOS를 사용하고 있음을 나타내는 설명을 추가하신 것을 확인했습니다. 좋아요, 거기에 GNU awk를 설치하시면 됩니다. 다른 awk를 사용하여 위의 작업을 수행할 수 있지만 각 입력 라인의 주요 문자에 대해 Unix 정렬을 호출하기 위해 쉘을 생성해야 합니다. 이는 값이 매우 느리고 쓰기가 약간 번거롭습니다. 정렬 알고리즘을 직접 구현해야 하고 작성하기가 힘들며 gawk를 빠르고 쉽게 설치할 수 있고 이 문제와 향후 문제를 해결할 수 있다면 그 모든 것은 가치가 없습니다.