簡體   English   中英

使用awk為列中的范圍提取行

[英]Extracting lines for a range in a column with awk

我有一個巨大的gzipped文件,根據第二列的范圍,我想提取它的某些行。

file1.txt.gz的開頭是:

zcat file1.txt.gz | head
1 1001 F K 999
1 1002 N G 340
1 1003 H B 889
1 1004 D F 399
1 1005 C X 311
2 1002 E F 233
2 1002 F C 334
3 1001 F C 331

我想提取以1開頭的行,並將second columns10011003 (包括1003 )。

所以預期的輸出是:

1 1001 F K 999
1 1002 N G 340
1 1003 H B 889

unzipping壓縮壓縮文件的頭部,然后應用以下命令,它工作,給出預期的輸出。 zcat file1.txt.gz | head | LC_ALL=C parallel -j 32 --block 10M --pipe grep -w "^1" | awk '$2 ~ /'1001'/,/'1003'/'

但是,如果我從unzipping開始, awk范圍過濾不起作用,它會抓取從1開始的所有內容:

zcat file1.txt.gz | LC_ALL=C parallel -j 32 --block 10M --pipe grep -w "^1" | awk '$2 ~ /'1001'/,/'1003'/'  > output.txt

現在, output.txt

1 1001 F K 999
1 1002 N G 340
1 1003 H B 889
1 1004 D F 399
1 1005 C X 311

PS:我從bash腳本調用命令,並從用戶輸入接受范圍( 10011003 )。

你能告訴我我錯過了什么以及如何解決它嗎?

如您在POST中所述,第1列以1開頭:

zcat file1.txt.gz | awk '/^1/ && $2 >= 1001 && $2 <= 1003'

或者如果您需要第1列為1字面:

zcat file1.txt.gz | awk '$1 == 1 && $2 >= 1001 && $2 <= 1003'

輸出:

1 1001 F K 999
1 1002 N G 340
1 1003 H B 889

一點解釋:

  • 這里沒有{print}語句,因為的默認行為是在滿足TRUE條件時打印

你可以嘗試一下,讓我知道這是否對你有幫助。 這將尋找第一列應為1

zcat file1.txt.gz | awk '$1==1 && ($2>=1001 && $2<=1003)'

如果您需要查找從`開始的行,那么請執行以下操作。

zcat file1.txt.gz | awk '/^1/ && ($2>=1001 && $2<=1003)'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM