나타내다

나타내다

내가 사용한 일반적인 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

우선, 나는 그것이 $2~IGNORECASE = 1;/lord/{print}당신이 생각하는 방식으로 작동하는지 의심합니다. AFAIK는 1변수에 값을 할당합니다 IGNORECASE. 의 값을 $2결과(예: $2 ~ 1)와 비교하고 기본적으로 $0결과가 true인지 인쇄합니다. 그런 다음 $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- 아니요, 전혀 그렇지 않습니다. IGNORECASE를 1에 할당한 결과에 대해 $2에 대한 정규 표현식 비교를 수행합니다. 이는 항상 true이므로 현재 줄을 인쇄합니다. 그런 다음 줄의 어느 곳에서든 정규식과 일치하는 문자열을 찾아 해당 lord줄을 두 번째로 인쇄합니다. 아마도 당신은 awk 'BEGIN{IGNORECASE = 1} $2~/lord/' *.tsv당신이 설명하는 대로 그렇게 하려고 했을 것입니다 .

이 맥락에서 "패턴"이라는 단어는 매우 모호하므로 사용하지 마세요. 패턴을 부분 정규식 일치로 사용하고 있지만 전체 단어 문자열 일치를 원하는 것처럼 설명합니다. 따라서 "패턴"을 질문에 나타나는 모든 문자열 또는 정규 표현식, 부분 또는 전체 및 단어 또는 줄 중 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, 이건 간단합니다.

귀하가 제공한 데이터 샘플을 시작으로 몇 가지 이름을 만들고 "Journey"에 대해 추측했습니다.

입력.tsv

ID 앨범 해시시
10 인터스텔라 메인 테마 확장 UDVtMYqUAyw
11 여행 XvG78AmBLc4
12 쥬라기 공원 음악 및 분위기 놀라운 사운드스케이프와 음악 PPl__iyIg6w
13 반지의 제왕 사운드 오브 더 샤이어 chLZQtCold8
14 반지의 제왕 샤이어: 백엔드의 일몰 uBmbI8dzc-M
  1. 쉘 변수 설정pattern
  2. 제거하다TSV를 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

관련 정보