특정 행에서 중복 문자열 제거

특정 행에서 중복 문자열 제거

특정 줄에 반복되는 문자열이 있는 여러 컴퓨터에 구성 파일이 있습니다.

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(또는 )를 사용합니까 ?uniqstrList::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하고 이 가정을 사용하여 정렬된 줄의 시작 부분에 배치합니다.

관련 정보