我有一个巨大的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 columns
从1001
提升到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
脚本调用命令,并从用户输入接受范围(1001
和1003
)。
你能告诉我我错过了什么以及如何解决它吗?
答案 0 :(得分:3)
如您在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}
语句,因为awk的默认行为是在满足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)'