我有一个巨大的 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
我正在解压缩
压缩文件的头部,然后应用以下命令,它起作用了,给出了预期的输出。 ( 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
)。
你能告诉我我缺少什么以及如何解决它吗?
最佳答案
如您在 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
条件时打印
关于bash - 使用 awk 提取列中范围的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49223356/