특정 줄에 반복되는 문자열이 있는 여러 컴퓨터에 구성 파일이 있습니다.
Option1 value
Option2 value
Option3 value
# Option X value
# commentary lines
...
AllowList user1@ip1 user1@ip2 user2@ip3 user2@ip4 user1@ip1 user1@ip2 user2@ip3 user2@ip4 ...
...
Option Z value
행에 AllowList
중복된 값이 있습니다 . 어떻게 제거하나요?
중복된 값을 제거하는 방법을 이미 알고 있습니다.
grep AllowList myconfig | tr ' ' '\n' | sort | uniq | xargs
하지만 다른 줄은 그대로 유지하면서 이 작업을 수행하고 싶습니다.
답변1
Perl은 어떻습니까 ? 에서 uniq
(또는 )를 사용합니까 ?uniqstr
List::util
$ perl -MList::Util=uniq -alpe '$_ = join " ", uniq @F if $F[0] eq "AllowList"' myconfig
Option1 value
Option2 value
Option3 value
# Option X value
# commentary lines
...
AllowList user1@ip1 user1@ip2 user2@ip3 user2@ip4 ...
...
Option Z value
-i
내부 작업을 위해 추가할 수 있습니다 .
답변2
allowlist.awk
:
/AllowList/{
for(i=1;i<=NF;i++){
#Check if the field is a repeated in the line, print the field if not.
if(!a[$i]++){
printf "%s ",$i
}
}
split("",a) #Equivalent to delete(a)
print "" #Print a newline
next
}
1
awk 스크립트를 실행하고 원본 파일을 덮어씁니다.
awk -f allowlist.awk myconfig > temporary
mv temporary myconfig
답변3
파일에서 관련 라인을 선택하고 이를 라인으로 분할한 다음 고유성 속성을 사용하여 정렬하고 다시 결합합니다.
grep '^AllowList' file | tr ' ' '\n' | LC_ALL=C sort -u | xargs
귀하의 예를 사용하면 다음과 같은 결과가 제공됩니다
AllowList user1@ip1 user1@ip2 user2@ip3 user2@ip4
대문자로 시작하는 줄의 유일한 "단어"는 키워드라고 가정 AllowList
하고 이 가정을 사용하여 정렬된 줄의 시작 부분에 배치합니다.