
내가 사용한 일반적인 tsv 파일의 일부
10 Interstellar Main Theme Extended UDVtMYqUAyw
11 Journey XvG78AmBLc4
12 Jurassic Park Music & Ambience Amazing Soundscapes and Music PPl__iyIg6w
13 Lord of the Rings Sound of The Shire chLZQtCold8
14 Lord of the Rings The Shire: Sunset at Bag End uBmbI8dzc-M
다음은 모든 tsv 파일의 두 번째 열에서 lor를 검색합니다(대소문자 구분 안 함).
awk '$2~IGNORECASE = 1;/lord/{print}' *.tsv
13 Lord of the Rings Sound of The Shire chLZQtCold8
14 Lord of the Rings The Shire: Sunset at Bag End uBmbI8dzc-M
Lord
이제 bash 환경 변수로 전달하고 싶습니다 .
$ awk -v Pattern="Lord" '$2~Pattern{print}' *.tsv
13 Lord of the Rings Sound of The Shire chLZQtCold8
14 Lord of the Rings The Shire: Sunset at Bag End uBmbI8dzc-M
질문
대소문자를 구분하지 않고 패턴 일치를 수행하는 방법은 무엇입니까?
다음을 시도했지만 작동하지 않습니다
awk -v Pattern="lord" '$2~IGNORECASE = 1;Pattern{print}' *.tsv
awk -v Pattern="lord" 'IGNORECASE = 1;$2~Pattern{print}' *.tsv
awk -v Pattern="lord" 'BEGIN {IGNORECASE = 1} {$2~Pattern{print}}' *.tsv
awk -v Pattern="Lord" '{IGNORECASE = 1; $2~Pattern}' *.tsv
인용하다
답변1
우선, 당신이 생각하는 것처럼 작동하는지 의심됩니다. AFAIK는 $2~IGNORECASE = 1;/lord/{print}
값을 결과(예: )와 비교하고 결과가 true이면 기본적으로 인쇄합니다. 그리고 비교1
IGNORECASE
$2
$2 ~ 1
$0
$0
/lord/
반품$0
이것이 사실이라면 인쇄하십시오.
대소문자를 구분하지 않고 비교 하려는 경우 $2
다음을 사용할 수 있습니다.
gawk 'BEGIN{IGNORECASE = 1} $2 ~ /lord/{print}` *.tsv
그렇지 않으면
gawk 'BEGIN{IGNORECASE = 1} $2 ~ /lord/` *.tsv
변수에 해당하는 것은 다음과 같습니다.
gawk -v Pattern="lord" 'BEGIN{IGNORECASE = 1} $2 ~ Pattern' *.tsv
이것은 IGNORECASE
표준 awk 기능이 아니라는 점에 유의하십시오. 내가 아는 한 GNU awk( gawk
)만이 이를 지원합니다. 이식성을 위해 특정 사례에 대한 입력을 사용하거나 가져올 toupper
수 있습니다.tolower
답변2
대략 The following searches for lord (case insensitively) in 2nd column of all tsv files: awk '$2~IGNORECASE = 1;/lord/{print}' *.tsv
- 아니요, 전혀 그렇지 않습니다. $2에 대한 정규식 비교를 수행하고 IGNORECASE를 값 1과 비교하여 이 결과가 항상 true이므로 현재 줄을 인쇄합니다. 그런 다음 lord
정규식과 일치하는 줄의 모든 문자열을 찾고, 발견되면 해당 줄을 다시 인쇄합니다. awk 'BEGIN{IGNORECASE = 1} $2~/lord/' *.tsv
그렇게 하면 설명하는 효과를 얻을 수 있기 때문에 아마도 이렇게 하려고 할 것입니다 .
이 문맥에서는 의미가 매우 모호하므로 "모드"라는 단어를 사용하지 마십시오. Pattern을 부분 정규식 일치로 사용하지만 전체 단어 문자열 일치를 원하는 것처럼 설명합니다. 따라서 올바른 솔루션을 찾는 데 도움을 드릴 수 있도록 "패턴"을 3개의 문자열 또는 정규식, 부분 또는 전체, 질문에 나타나는 단어 또는 줄로 바꾸십시오. 바라보다패턴과 일치하는 텍스트를 찾는 방법더 많은 정보를 알고 싶습니다.
수행하려는 작업에 대한 몇 가지 가능한 해결 방법은 다음과 같습니다.
부분 문자열 일치:
$ awk -v var="$var" -F'\t' 'index(tolower($2),tolower(var))' file.tsv
13 Lord of the Rings Sound of The Shire chLZQtCold8
14 Lord of the Rings The Shire: Sunset at Bag End uBmbI8dzc-M
전체 단어 문자열 일치:
$ awk -v var="$var" -F'\t' 'index(" "tolower($2)" ",tolower(var))' file.tsv
13 Lord of the Rings Sound of The Shire chLZQtCold8
14 Lord of the Rings The Shire: Sunset at Bag End uBmbI8dzc-M
전체 줄 문자열 일치:
$ awk -v var="$var" -F'\t' 'tolower($2) == tolower(var)' file.tsv
$
부분 정규식 일치:
$ awk -v var="$var" -F'\t' 'tolower($2) ~ tolower(var)' file.tsv
13 Lord of the Rings Sound of The Shire chLZQtCold8
14 Lord of the Rings The Shire: Sunset at Bag End uBmbI8dzc-M
전체 단어 정규식 일치:
$ awk -v var="$var" -F'\t' '(" "tolower($2)" ") ~ tolower(var)' file.tsv
13 Lord of the Rings Sound of The Shire chLZQtCold8
14 Lord of the Rings The Shire: Sunset at Bag End uBmbI8dzc-M
전체 라인 정규식 일치:
$ awk -v var="$var" -F'\t' 'tolower($2) ~ ("^"tolower(var)"$")' file.tsv
$
위의 내용은 쉘 변수에 이스케이프 시퀀스가 포함되어 있지 않거나 포함된 경우 확장하기를 원한다고 가정합니다. 그렇지 않은 경우 ENVIRON[]
또는 ARGV[]
대신 쉘 변수의 값을 awk에 전달하는 데 사용 -v
하십시오.awk 스크립트에서 쉘 변수를 사용하는 방법더 알아보기.
답변3
그리고 perl
:
파일의 두 번째 필드에서 패턴을 검색합니다.
perl -F"\t" -lane '$F[1] =~ /(?i)lord/ and print' input.tsv
-F"\t"
파일이 tsv라서요$F[1]
필드의 색인이 0이므로 두 번째 레코드 파일입니다.(?i)
정규 표현식의 옵션은 대소문자를 구분하지 않습니다.- 또는 수정자를
i
사용하여 대소문자를 구분할 수 있습니다.
perl -F"\t" -lane '$F[1] =~ /lord/i and print' input.tsv
export
쉘 변수와 일치하는 정규식은 다음과 같이 완성될 수 있습니다.
export p=lord
perl -F"\t" -lane '$F[1] =~ /(?i)$ENV{p}/ and print' input.tsv
perl -F"\t" -lane '$F[1] =~ /$ENV{p}/i and print' input.tsv
.tsv
폴더의 모든 파일 검색 :
perl -F"\t" -lane '$F[1] =~ /$ENV{p}/i and print' *.tsv
레코드와 함께 파일 이름을 원하면 다음과 같이 할 수 있습니다.
perl -F"\t" -lane '$F[1] =~ /$ENV{p}/i and print $ARGV. ":" .$_' *.tsv
답변4
사용할 필요가 없는 경우앗그리고 표 형식 데이터 작업을 위해 설계된 도구를 사용할 수 있습니다.GoCSV, 이것은 스냅샷입니다.
귀하가 제공한 데이터 샘플을 시작으로 몇 가지 이름을 만들고 "여행"을 추측했습니다.
입력.tsv
ID | 앨범 | 길 | 해시 값 |
---|---|---|---|
10 | 인터스텔라 | 테마 확장 | UDVtMYqUAyw |
11 | 여행하다 | XvG78AmBLc4 | |
12 | 쥬라기 공원의 음악과 분위기 | 놀라운 사운드스케이프와 음악 | PPl__iyIg6w |
13 | 반지의 제왕 | 샤이어의 목소리 | chLZQtCold8 |
14 | 반지의 제왕 | 샤이어: 백엔드의 일몰 | uBmbI8dzc-M |
- 쉘 변수 설정
pattern
- DelimTSV를 CSV로 변환
- 필터2열에-나 케이스는 변경되지 않았습니다. --정규 표현식쉘 변수
- 참수일치하는 행만 가져오기
- TSV로 다시 변환:
pattern='lord'
gocsv delim -i "\t" input.tsv \
| gocsv filter -c 2 -i --regex "$pattern" \
| gocsv behead \
| gocsv tsv
13 Lord of the Rings Sound of The Shire chLZQtCold8
14 Lord of the Rings The Shire: Sunset at Bag End uBmbI8dzc-M