쉘의 구분 기호를 기반으로 데이터 필터링

쉘의 구분 기호를 기반으로 데이터 필터링

다음과 같은 데이터가 포함된 파일이 있습니다.

"google1|yoo|dummy|yes|wow|/" + VARIABLE + "/"
"google2|hub|lab|dummy|yes|/" + VARIABLE + "/"
"google3|short|lab|yoo|/" + VARIABLE + "/"
"google4|hello|good-guy|bad-girl|lol|dummy|/" + VARIABLE + "/"
"google5|good-guy|a4-123|yoo|/" + VARIABLE + "/"
"google6|bad-girl|b4-124|hub|/" + VARIABLE + "/"

이제 구분 기호 "|" 사이의 문자열 목록을 가져오고 싶습니다. (파이프).

출력은 다음과 같아야합니다

yoo
dummy
yes
wow
hub
hello
good-guy
bad-girl
a4-123
b4-124
dummy
lol
short
lab

기본적으로 구분 기호 필터 이후의 문자열 목록에서 고유한 값을 갖고 싶습니다. 나는 awk를 다음과 같이 사용해 보았습니다.

awk -F"|" '{gsub(/\).*/,"",$2);print $2}' file

하지만 잘못된 데이터를 얻었습니다.

답변1

grep옵션 이 있는 경우 pcre:

$ grep -oP '\|\K[^|]+(?=\|)' ip.txt | sort -u
a4-123
b4-124
bad-girl
dummy
good-guy
hello
hub
lab
lol
short
wow
yes
yoo
  • -o일치하는 패턴만 인쇄
  • -Ppcre 정규식을 사용하세요
  • \|\K|추출할 문자열 앞에 있는지 확인하기 위한 긍정적인 뒤돌아보기
    • 마찬가지로, 추출할 문자열 뒤에 (?=\|)있는지 확인하기 위한 긍정적인 예측|
  • [^|]+추출할 문자열 - 단순히 |해당 문자를 하나 이상 부정하고 가져옵니다.
  • sort -u독특한 가치를 얻기 위해

이러한 문자열이 발견되는 순서를 유지하려면 다음을 수행하십시오.

$ grep -oP '\|\K[^|]+(?=\|)' ip.txt | awk '!seen[$0]++'
yoo
dummy
yes
wow
hub
lab
short
hello
good-guy
bad-girl
lol
a4-123
b4-124

답변2

순서에 관심이 없다면 Perl 해시를 사용하여 고유성을 보장할 수 있습니다.

$ perl -lne '$h{$_}++ for /(?<=\|).*?(?=\|)/g; END{print for keys %h}' file
short
b4-124
lol
yes
bad-girl
lab
yoo
good-guy
hub
dummy
hello
a4-123
wow

보다Perl에서 정규식 일치로 해시 만들기

답변3

다음은 어떻습니까?

cut file -d'|' -f2,3,4 | tr '|' '\n'

위 명령은 고정된 수의 열(3)을 인쇄합니다. 가 처음 나타날 때까지 가변 개수의 열을 인쇄하려면 /다음과 같이 사용할 수 있습니다.

cut -d'/' -f1 file | cut  -d'|' -f2- | tr '|' '\n'

답변4

출력에 "더미"가 반복됩니다. 이것이 아래 스크립트로 얻은 것입니다.

   awk -f f1.awk /tmp/f1
    short
    hub
    wow
    hello
    a4-123
    b4-124
    yes
    yoo
    lol
    bad-girl
    good-guy
    lab
    dummy

    cat f1.awk 
    {
      n=split($1,a,"|")

      for(i=2; i<n; i++) {
        arr[a[i]] = a[i] 
      } 
    }   
    END{
      for (var in arr) 
        print(var)  
    }

관련 정보