인용하다

인용하다

내가 사용한 일반적인 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이면 기본적으로 인쇄합니다. 그리고 비교1IGNORECASE$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
  1. 쉘 변수 설정pattern
  2. DelimTSV를 CSV로 변환
  3. 필터2열에-나 케이스는 변경되지 않았습니다. --정규 표현식쉘 변수
  4. 참수일치하는 행만 가져오기
  5. 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

관련 정보