逗号将单词分隔成新行

逗号将单词分隔成新行

我有一个输入文件,如下所示

N1518    AMP,AUG,AZM,CHL 
N1520    AZM,NAL
N1524    AMP,NAL,STR
......

我正在尝试将其转换为

N1518    AMP
N1518    AUG
N1518    AZM
N1518    CHL
N1520    AZM
N1520    NAL
N1524    AMP
N1524    NAL
N1524    STR
....

有没有一个班轮可以做到这一点?

答案1

尝试这个,

awk -F '[\t,]' '{for (i=2;i<NF;i++) print $1"\t"$i}' file
N1518 AMP
N1518 AUG
N1518 AZM
N1518 CHL
N1520 AZM
N1524 AMP
N1524 NAL

答案2

您可以使用带有多个分隔符的 awk,然后迭代字段以打印列。

awk -F'[ ,]+' '{for (i=2;i<=NF;i++) {printf "%s %s\n",$1,$i;}}' file

解释:

-F'[ ,]+' :这告诉 awk 使用空格和逗号作为字段分隔符。它还告诉它将连续分隔符视为单个分隔符。

for (i=2;i<=NF;i++): 从第二列开始循环所有列,因为我们必须重复打印第一列。

printf "%s %s\n",$1,$i;:打印一行包含第一列和第 i 列

答案3

使用以下脚本进行测试,效果也很好

计数行=awk '{print NR}' filename| sort -nr| sed -n '1p'

for ((i=1;i<=$count_line;i++)); do fi=`awk -v i="$i" 'NR==i{print $1}' filename`; h=`awk -v i="$i"  'NR==i{print $2}' filename|awk -F "," '{print NF}'|  sort -nr | sed -n '1p'`; for ((j=1;j<=$h;j++)); do echo $fi;awk -v i="$i" -v j="$j" 'NR==i{print $2}' filename| awk -v j="$j" -F ","  '{print $j}' ; done; done|sed "N;s/\n/ /g"

输出

N1518 AMP
N1518 AUG
N1518 AZM
N1518 CHL
N1520 AZM
N1520 NAL
N1524 AMP
N1524 NAL
N1524 STR

答案4

使用GNU sed扩展正则表达式模式-E选项,您的问题可以如下实现:

$ sed -Ee 's/^((\S+\t)[^,]+),/\1\n\2/;P;D' inp

输出:

N1518   AMP
N1518   AUG
N1518   AZM
N1518   CHL
N1520   AZM
N1520   NAL
N1524   AMP
N1524   NAL
N1524   STR

相关内容