gpt4 book ai didi

regex - bash:从文件中读取每一行并用作正则表达式来匹配和打印列 awk

转载 作者:行者123 更新时间:2023-11-29 09:37:59 26 4
gpt4 key购买 nike

我想将文件 samples.txt 的每一行用作正则表达式,并打印与 input.txt 中匹配的整列。

示例.txt

aa
bb
cc

输入.txt

s   aa    v    dd    jj    bb    ww    cc
1 1 1 1 2 3 3 8
3 5 4 5 2 7 5 8

输出.txt

aa    bb    cc
1 3 8
5 7 8

我可以分别执行这些操作——读取 bash 中的每一行然后将其用作正则表达式,并分别使用正则表达式打印匹配列,但我不能将它们放在一起。有什么建议吗?

要打印每个匹配的列,我可以使用:

awk 'NR==1 {for(i=1;i<=NF;i++) if ($i~/$line/) f=i;next} {print $f}' input.txt

并为每一行遍历文件以用作上面的正则表达式:

while read line; do echo $line; done < samples.txt

但是我不能把这两个放在一起...

while read line; do
awk 'NR==1 {for(i=1;i<=NF;i++) if ($i~/$line/) f=i;next} {print $f}' input.txt >> output.txt; done < samples.txt

最佳答案

在 awk 中

awk 'NR==FNR{a[$1]++;next}FNR==1{for(i=1;i<=NF;i++)b[i]=a[$i]}
{for(i=1;i<=NF;i++)if(b[i])printf "%s\t",$i;print x}' {samples,input}.txt

aa bb cc
1 3 8
5 7 8

这基本上是在第一个文件的数组中收集样本。接下来在第二行的第一行,将每个字段与样本进行比较,如果相同则将它们设置为 1。

然后遍历每一行,只打印数组中设置为一个的字段。

按照 (Kent|Fedorqui|Ed Morton) 的建议删除尾随标签

awk 'NR==FNR{a[$1]++;next}FNR==1{for(i=1;i<=NF;i++)b[i]=a[$i]==1&&last=i}
{for(i=1;i<=NF;i++)if(b[i])printf "%s",$i (i==last?ORS:OFS)}' {samples,input}.txt

关于regex - bash:从文件中读取每一行并用作正则表达式来匹配和打印列 awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30733367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com