我有一个输入文件,如下所示
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