다음과 같은 데이터가 포함된 파일이 있습니다.
"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)
}