使用awk为列中的范围提取行

时间:2018-03-11 18:08:37

标签: bash 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 columns1001提升到1003(包括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)。

你能告诉我我错过了什么以及如何解决它吗?

2 个答案:

答案 0 :(得分:3)

如您在POST中所述,列11开头:

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 :(得分:1)

请您试试,请告诉我这是否对您有所帮助。这将查找第一列应为1

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

如果您需要查找仅从`开始的行,那么请执行以下操作。

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