我有一个具有以下结构的文本文件。我想在逗号之前删除第一部分并保持休息,然后将它们与第二列匹配并将它们放在单独的行中。
INPUT:
A,B,C London
G,L,K,I Berlin
Q,O,M,J Madrid
我想要这样的输出:
输出:
B London
C London
L Berlin
K Berlin
I Berlin
O Madrid
M Madrid
J Madrid
答案 0 :(得分:3)
Perl方式
perl -aF[\\s,]+ -nE'say "$_ $F[-1]" for @F[1..$#F-1]' myfile
<强>输出强>
B London
C London
L Berlin
K Berlin
I Berlin
O Madrid
M Madrid
J Madrid
答案 1 :(得分:2)
由于您有perl
代码:
perl -alne '$F[0]=~s/^.*?,//g; @a=split /,/,$F[0]; map { print "$_ $F[1]" } @a' file
B London
C London
L Berlin
K Berlin
I Berlin
O Madrid
M Madrid
J Madrid
说明:
-a
将字段拆分为数组@F
-l
在每个打印语句后打印\n
-n
循环文件$F[0]=~s/^.*?,//g;
删除字符串之间的任何内容
和,
表示阵列@F @a=split /,/,$F[0];
创建数组@a
map { print "$_ $F[1]" } @a
也可以写为foreach(@a){print "$_ $F[1]"}
使用shift
缩短版本:
perl -alne '@a=split /,/,$F[0]; shift @a; print "$_ $F[1]" for @a' file
答案 2 :(得分:0)
这可以是awk的一种方式:
$ awk '{n=split($1, a, ","); for (i=2; i<=n; i++) print a[i], $NF}' file
B London
C London
L Berlin
K Berlin
I Berlin
O Madrid
M Madrid
J Madrid
n=split($1, a, ",")
根据逗号作为分隔符将第一个字段分割成多个片段。 split
返回切片数量,然后存储切片。for (i=2; i<=n; i++) print a[i], $NF
然后我们遍历所有这些切片,从第二个切片开始,将每个切片与最后一个字段(城市名称)一起打印。