bash - 使用 awk 提取列中范围的行

标签 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 columns10011003 (包括 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 脚本调用命令,并接受用户输入的范围(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条件时打印

关于bash - 使用 awk 提取列中范围的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49223356/

相关文章:

linux - 如何表达 "map a linux command to each line in a file"?

python - 从终端启动和使用 popen 启动之间的 OpenOffice 行为差异 - 均在 chroot 中

bash 如果字符串不包含多个条目

正则表达式匹配两个字符串之间所有字符的最后一次出现

shell - awk 根据日期条件过滤行

shell - grep/sed/awk 删除某一行之前的所有内容

linux - 无法删除目录中的所有文件

linux - 在 Linux 中作用于多个文件的脚本

linux - 别名 mkdir 以在 Mac 上打印详细输出

shell - awk:每两个字段写入换行符