通过bash工具从文本文件中提取列范围

时间:2017-05-12 18:27:47

标签: string bash awk split multiple-columns

假设一个文本文件(file1)包含多行字母字符串,每个字符串前面都有一个用作条形码的短字母数字字符串。字母串的长度都是相同的,前面的字母数字不是。字母和字母数字字符串由每行中的空格分隔。

$ cat file1
a1 abcdefghijklmnopqrstuvwxyz
b27 abcdefghijklmnopqrstuvwxyz
c4 abcdefghijklmnopqrstuvwxyz

假设第二个文件(file2)包含有关列范围的信息。此范围始终小于字母字符串。

$ cat file2
2-13

我正在尝试开发bash代码,从file2中的字母字符串中提取file1中指定的列范围,同时保留条形码。

$ sought_command file1 file2
a1 bcdefghijklm
b27 bcdefghijklm
c4 bcdefghijklm

我不确定哪个bash power工具在这方面会有所帮助,但假设awk将成为可以做到这一点的工具。

注意:我知道Python中的代码可能最容易编写关于此任务,我做了。但是,我发现我的Python实现非常慢,因为要处理的字母字符串长达数万个字符。因此,我故意尝试使用bash工具解决此问题。

1 个答案:

答案 0 :(得分:3)

$ awk 'NR==FNR{start=$1;lgth=$2;next} {print $1, substr($2,start,lgth)}' FS='-' file2 FS=' ' file1
a1 bcdefghijklmn
b27 bcdefghijklmn
c4 bcdefghijklmn

或者如果第二个字段是结束位置而不是长度:

$ awk 'NR==FNR{start=$1;lgth=$2-$1+1;next} {print $1, substr($2,start,lgth)}' FS='-' file2 FS=' ' file1
a1 bcdefghijklm
b27 bcdefghijklm
c4 bcdefghijklm