열 11과 21을 기반으로 텍스트 파일에서 중복 항목을 제거하는 쉘 스크립트를 어떻게 얻을 수 있습니까?

열 11과 21을 기반으로 텍스트 파일에서 중복 항목을 제거하는 쉘 스크립트를 어떻게 얻을 수 있습니까?

11~21열을 기반으로 텍스트 파일에서 중복 항목을 제거하는 쉘 스크립트를 어떻게 얻을 수 있습니까?

샘플 파일:

Header:0000000000000001457854500000
XP        12345678912yeyeyeyeeye   0000003
XP        12345678913yeyeyeyeeye   0000002
XP        12345678912yeyeyeyeeye   0000004
XP        12345678913yeyeyeyeeye   0000001
Footer:0000000000000001245856500004

예상 출력:

Header:0000000000000001457854500000
XP        12345678913yeyeyeyeeye   0000001
Xp        12345678912yeyeyeyeeye   0000004
Footer:0000000000000001245856500001

답변1

예상되는 출력에 따라 다음과 같을 수 있습니다.

awk 'NF <= 1 || !seen[substr($0, 11, 11)]++'

또는

awk 'NF <= 1 || !seen[substr($2, 1, 11)]++'

또는 마지막 기록을 유지하십시오.

awk '!second_pass {if (NF > 1) count[substr($2, 1, 11)]++; next}
     NF <= 1 || --count[substr($2, 1, 11)] == 0' file second_pass=1 file

답변2

명령: header=sed -n '1p' l.txt ; footer=sed -n '$p' l.txt;sed -e '1d' -e '$d' l.txt |awk '{if (!seen[$2]++)print $0}'| sed '1i '$header''| sed '$s/.*/&\n'$footer'/g'

산출

header=`sed -n '1p' l.txt`; footer=`sed -n '$p' l.txt`;sed -e '1d' -e '$d' l.txt |awk '{if (!seen[$2]++)print $0}'| sed '1i '$header''| sed '$s/.*/&\n'$footer'/g'

Header:0000000000000001457854500000
XP        12345678912yeyeyeyeeye   0000003
XP        12345678913yeyeyeyeeye   0000002
Footer:0000000000000001245856500004

관련 정보