微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何用';'分割第二列并附加第一列值

如何解决如何用';'分割第二列并附加第一列值

最好和最简单的方法是什么?

我有两列的 tsv 文件

id1<\tab>name1;name2;name3
id2<\tab>name11;name22;name3
id3<\tab>name111;name2;name3333

我想更改列顺序 ((names)id),将第一列用 ';' 拆分并将相应的 id 附加到每一行。我的意思是这样的:

name1<\tab>id1
name2<\tab>id1
name3<\tab>id1
name11<\tab>id2
name22<\tab>id2
name3<\tab>id2
name111<\tab>id3
name2<\tab>id3
name3333<\tab>id3

感谢您的帮助!

解决方法

在每个 Unix 机器上的任何 shell 中使用任何 awk,一种选择是将字段分隔符设置为包括制表符和分号。

awk -F'[\t;]' -v OFS='\t' '{for (i=2; i<=NF; i++) print $i,$1}' file

样品运行:

$ cat -A file
id1^Iname1;name2;name3$
id2^Iname11;name22;name3$
id3^Iname111;name2;name3333$
$ awk -F'[\t;]' -v OFS='\t' '{for (i=2; i<=NF; i++) print $i,$1}' file | cat -A
name1^Iid1$
name2^Iid1$
name3^Iid1$
name11^Iid2$
name22^Iid2$
name3^Iid2$
name111^Iid3$
name2^Iid3$
name3333^Iid3$
,

在 bash 解释器中 -

 while IFS="$IFS;" read -a c;do for n in 1 2 3; do echo "${c[$n]}   ${c[0]}"; done<file

while IFS="$IFS;" read id n1 n2 n3; do printf "%s\t%s\n" $n1 $id $n2 $id $n3 $id; done<file

可以printf "%s\t$id\n" $n1 $n2 $n3,但是将变量嵌入到格式字符串中通常是个坏主意...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。