假设一个文本文件(file1)包含m行字母字符串S (S_1,S_2,.,S_m)。每个S前面都有一个简短的字母数字字符串,充当条形码(此处: foo1、bar7、baz3)。字母字符串S的长度都是相同的。每个S及其前面的条形码用空格分隔。
$ cat file1
foo1 abcdefghijklmnopqrstuvwxyz
bar7 abcdefghijklmnopqrstuvwxyz
baz3 abcdefghijklmnopqrstuvwxyz假设第二个文件(file2)包含列范围R的n个规范(R_1,R_2,.,R_n)。列范围位于一行上,由空格分隔。每个R_x都小于S,范围的组合长度(即R_1 + R_2 +.+ R_n)也小于S。
$ cat file2
2-11 14-19 23-24在this excellent answer之后,我理解可以通过以下awk命令提取所有S的第一个范围(即R_1),同时保持正确分配条形码:
awk 'NR==FNR{start=$1;lgth=$2;next} {print $1, substr($2,start,lgth)}' FS='-' file2 FS=' ' file1但是,我不确定如何将awk代码扩展到所有其他范围(这里是: R_2和R_3),并将它们分别附加到增长的矩阵中。
$ sought_outcome
foo1 bcdefghijknopqrswx
bar7 bcdefghijknopqrswx
baz3 bcdefghijknopqrswx编辑:为了更好地理解,下面是所示的所寻求的输出,从而使空白空间强调连接点:
2-11 14-19 23-24
foo1 bcdefghijk nopqrs wx
bar7 bcdefghijk nopqrs wx
baz3 bcdefghijk nopqrs wx发布于 2017-10-30 19:15:38
awk去营救!没有任何验证检查!
$ awk 'NR==FNR {printf "%s", "key";
for(i=1;i<=NF;i++)
{split($i,x,"-");
start[i]=x[1];
end[i] =x[2];
printf "%s", FS $i};
print "";
next}
{printf "%s", $1;
for(i in start) printf "%s", FS substr($2,start[i],end[i]-start[i]+1);
print ""}' range file |
column -t
key 2-11 14-19 23-24
foo1 bcdefghijk nopqrs wx
bar7 bcdefghijk nopqrs wx
baz3 bcdefghijk nopqrs wx或者,没有头和分裂
$ awk 'NR==FNR{for(i=1;i<=NF;i++)
{split($i,x,"-"); start[i]=x[1]; end[i]=x[2]};
print ""; n=NF; next}
{printf "%s", $1 FS;
for(i=1;i<=n;i++) printf "%s", substr($2,start[i],end[i]-start[i]+1); print ""}' range file column -t
foo1 bcdefghijknopqrswx
bar7 bcdefghijknopqrswx
baz3 bcdefghijknopqrswx然而,更新,使用剪切/粘贴可能更容易
$ paste -d' ' <(cut -d' ' -f1 file) <(cut -d' ' -f2 file | cut -c$(tr ' ' ',' <range))
foo1 bcdefghijknopqrswx
bar7 bcdefghijknopqrswx
baz3 bcdefghijknopqrswx发布于 2017-10-31 11:03:40
我想出的结果与@karakfas第二脚本几乎完全相同,但我发现他格式化代码的方式非常难读,所以我想我还是会发布以下内容:
$ cat tst.awk
NR==FNR {
for (i=1; i<=NF; i++) {
split($i,range,/-/)
beg[i] = range[1]
end[i] = range[2]
}
numRanges = NF
next
}
{
printf "%s%s", $1, OFS
for (i=1; i<=numRanges; i++) {
printf "%s", substr($2,beg[i],(end[i]-beg[i])+1)
}
print ""
}
$ awk -f tst.awk file2 file1
foo1 bcdefghijknopqrswx
bar7 bcdefghijknopqrswx
baz3 bcdefghijknopqrswxhttps://stackoverflow.com/questions/47022297
复制相似问题