
다음과 같은 데이터가 포함된 파일이 있습니다.
"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
일치하는 패턴만 인쇄-P
pcre 정규식을 사용하세요\|\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
답변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)
}