来自第2列的多个匹配,并与第1列相结合,与端子分开

  • 本文关键字:1列 相结合 2列 bash text awk sed
  • 更新时间 :
  • 英文 :


我有一个文件,它的内容在两列中如下

fsfsfsf ukd18178486|ukd18178488  
adadvafv ukd17647236|ukd17647238  
bcghdbdhdb ukd18256238|ukd18256240|ukd18256242|ukd18256243|ukd18256244  
dadadad ukd18318607|ukd18318608|ukd18318609

我需要做的是生成一个具有等模式的单独文件

fsfsfsf?ukd=ukd18178486  
fsfsfsf?ukd=ukd18178488  
adadvafv?ukd=ukd17647236  
adadvafv?ukd=ukd17647238  
bcghdbdhdb?ukd=ukd18256238  
bcghdbdhdb?ukd=ukd18256240  
bcghdbdhdb?ukd=ukd18256242  

基本上将第一列中的每一行与第二列中所有对应的"ukd[0-9]+"组合,依此类推,直到第一列中所有的行都用完为止。有任何使用awk/grep/sed组合的方法吗?

awk前往救援!

$ awk '{n=split($2,a,"|"); for(i=1;i<=n;i++) printf "%s?udk=%sn",$1,a[i]}' file
fsfsfsf?udk=ukd18178486
fsfsfsf?udk=ukd18178488
adadvafv?udk=ukd17647236
adadvafv?udk=ukd17647238
bcghdbdhdb?udk=ukd18256238
bcghdbdhdb?udk=ukd18256240
bcghdbdhdb?udk=ukd18256242
bcghdbdhdb?udk=ukd18256243
bcghdbdhdb?udk=ukd18256244
dadadad?udk=ukd18318607
dadadad?udk=ukd18318608
dadadad?udk=ukd18318609

这可能对你有用(GNU sed):

sed -r 's/^((.* )[^|]*)|/1n2/;s/ ([^0-9]*)/?1=1/;P;D' file

用换行符和记录的键替换|。然后对记录进行模式匹配,将记录转换为所需的格式。打印第一行,删除第一行,然后重复。

这很可能通过一次替换来实现,但如果去除第二次替换,观察者可以看到第一次替换是如何将线从一个转换为两个等等。

最新更新