![하위 문자열을 찾아 텍스트 파일에서 다음 줄을 추출합니다.](https://linux55.com/image/202386/%ED%95%98%EC%9C%84%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%B0%BE%EC%95%84%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%8B%A4%EC%9D%8C%20%EC%A4%84%EC%9D%84%20%EC%B6%94%EC%B6%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
다음 형식의 탭으로 구분된 텍스트 파일이 있습니다.
Name city info
Stef NY=123 ID=1;CITY=NY
John SE=981;819 ID=110;CITY=SE
Stef SE=01 ID=20;CITY=SE
Kelly SE=111;787 ID=100;CITY=NY
Lena NY=815;981;1 ID=2111;CITY=NY
세 번째 열에서 ID가 100보다 큰 새 텍스트 파일로 행을 추출하려고 하므로 예상되는 출력은 다음과 같습니다.
Name city info
John SE=981;819 ID=110;CITY=SE
Lena NY=815;981,1 ID=2111;CITY=NY
지금까지 가지고 있는 awk 명령은 다음과 같습니다.
awk '$3 !~ /^ID=[0-9];/' file.txt > output.txt
그러나 이렇게 하면 ID가 9 이하인 행만 삭제됩니다. ID가 100 미만인 모든 행을 제외하는 방법을 모르겠습니다. 어떻게 이것을 달성할 수 있습니까? 통찰력을 높이 평가하겠습니다.
답변1
사용밀러
$ mlr --tsv filter 'i = splitkv($info, "=", ";"); i["ID"] > 100' file.txt
Name city info
John SE ID=110;CITY=SE
Lena NY ID=2111;CITY=NY
GNU awk 사용:
$ gawk -F '\t' 'NR==1 || match($3,/ID=([0-9]+)/,arr) && arr[1]+0 > 100' file.txt
Name city info
John SE ID=110;CITY=SE
Lena NY ID=2111;CITY=NY
답변2
실제 입력이 제공한 예와 같다고 가정합니다.
$ awk -F'[=;]' 'NR==1 || $(NF-2)>100' file
Name city info
John SE=981;819 ID=110;CITY=SE
Lena NY=815;981;1 ID=2111;CITY=NY
[=;]
각 레코드를 필드로 분할하도록 awk에 지시 하도록 FS를 설정하는 방법은 다음과 같습니다 .
$ awk -F'[=;]' '{print "---------" ORS $0; for (i=1;i<=NF;i++) print NF, i, "<"$i ">"}' file
---------
Name city info
1 1 <Name city info>
---------
Stef NY=123 ID=1;CITY=NY
5 1 <Stef NY>
5 2 <123 ID>
5 3 <1>
5 4 <CITY>
5 5 <NY>
---------
John SE=981;819 ID=110;CITY=SE
6 1 <John SE>
6 2 <981>
6 3 <819 ID>
6 4 <110>
6 5 <CITY>
6 6 <SE>
---------
Stef SE=01 ID=20;CITY=SE
5 1 <Stef SE>
5 2 <01 ID>
5 3 <20>
5 4 <CITY>
5 5 <SE>
---------
Kelly SE=111;787 ID=100;CITY=NY
6 1 <Kelly SE>
6 2 <111>
6 3 <787 ID>
6 4 <100>
6 5 <CITY>
6 6 <NY>
---------
Lena NY=815;981;1 ID=2111;CITY=NY
7 1 <Lena NY>
7 2 <815>
7 3 <981>
7 4 <1 ID>
7 5 <2111>
7 6 <CITY>
7 7 <NY>
답변3
헤더 아래 전체 파일의 형식이 동일한 경우:
awk -F '=|;' 'NR==1; $2>100' location
구분 기호를 또는 로 설정하고 =
헤더 ;
를 인쇄한 다음 두 번째 필드가 100보다 큰 첫 번째 줄 뒤의 모든 줄을 인쇄합니다.
산출:
Name city info
John SE ID=110;CITY=SE
Lena NY ID=2111;CITY=NY
답변4
매우 순진한 해결책은 다음과 같습니다.
awk -F'\t' '{
o=$3
sub(/ID=/,"",o)
if(o + 0 > 100) print
}' test
보다 발전된 접근 방식은 다음과 같습니다.
awk -F'\t' 'NR == 1 || (match($3, /[0-9]+/) && substr($3, RSTART, RLENGTH) + 0 > 100)' test
match
세 번째 필드에는 최소 3자리 숫자를 입력 해 보세요 .
match
변수는 정규 표현식이 일치를 시작하는 인덱스에 설정되거나 RLENGTH
일치 항목이 전혀 발견되지 않으면 0으로 설정됩니다.
그런 다음 전체 일치 항목( RSTART
~ RLENGTH
)이 100보다 큰지 확인할 수 있습니다. 그렇다면 전체 행을 인쇄하십시오.