提取和匹配文本文件中的列

时间:2014-07-20 10:24:41

标签: perl awk cut

我有一个具有以下结构的文本文件。我想在逗号之前删除第一部分并保持休息,然后将它们与第二列匹配并将它们放在单独的行中。

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

3 个答案:

答案 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

说明:

  1. -a将字段拆分为数组@F
  2. -l在每个打印语句后打印\n
  3. -n循环文件
  4. $F[0]=~s/^.*?,//g;删除字符串之间的任何内容 和,表示阵列@F
  5. 的位置0
  6. @a=split /,/,$F[0];创建数组@a
  7. map { print "$_ $F[1]" } @a也可以写为foreach(@a){print "$_ $F[1]"}
  8. 使用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然后我们遍历所有这些切片,从第二个切片开始,将每个切片与最后一个字段(城市名称)一起打印。