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

Perl 提取和匹配文本文件中的列,perl,awk,cut,Perl,Awk,Cut,我有一个具有以下结构的文本文件。我想删除逗号前的第一部分,保留其余部分,然后将它们与第二列匹配,并将它们放在单独的行中 输入: 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 这可能是awk的一种方式: $ awk '{n=split($1,

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

输入:

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

这可能是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

$awk'{n=split($1,a,“,”);for(i=2;i这可能是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

$awk'{n=split($1,a,“,”);for(i=2;i,因为您有
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的位置0
  • @a=split/,/,$F[0];
    创建数组
    @a
  • map{print“$\u$F[1]”}@a
    也可以写成
    foreach(@a){print“$\u$F[1]”}
  • 使用
    shift
    的较短版本:

    perl -alne '@a=split /,/,$F[0]; shift @a; print "$_ $F[1]" for @a' file
    

    由于您有
    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的位置0
  • @a=split/,/,$F[0];
    创建数组
    @a
  • map{print“$\u$F[1]”}@a
    也可以写成
    foreach(@a){print“$\u$F[1]”}
  • 使用
    shift
    的较短版本:

    perl -alne '@a=split /,/,$F[0]; shift @a; print "$_ $F[1]" for @a' file
    
    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
    
    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
    

    谢谢。它成功了。你能给我推荐一个在线页面,让我可以学习更多关于Awk和Sed的知识吗?@palc读起来很高兴。我有点喜欢这个关于习惯性Awk的页面:首先,阅读
    Sed
    也很好。我没有任何特别的建议,也许
    人Sed
    和谷歌一点其他东西。最后,尝试这样做我的问题很有帮助!谢谢。它成功了。你能给我推荐一个在线页面,让我可以了解更多关于Awk和Sed的信息吗?@palc读起来很高兴。我有点喜欢这个关于习惯性Awk的页面:首先,阅读
    Sed
    也很好。我没有任何特别的建议,也许
    man-Sed
    和谷歌最后,尝试在中解决问题会有很大帮助。
    map{print“$\$F[1]”a
    对于@a
    @Borodin来说写为
    print“$\$F[1]”要好得多。
    map{print”$\$F[1]”a
    写为
    print“$\$F[1]”对于@a
    @Borodin,谢谢你,因为我不知道这是可能的。
    -F[\s,]+
    不起作用。
    perl-aF',\s+'-nE'$v=pop@F;shift@F;对@F'文件说“$\u$v”,我不知道为什么。@Tiago:
    -a
    意味着
    -n
    +
    @fedorqui:对不起,我明白了。修正了。很抱歉打扰你,但你知道为什么会这样吗:paste.ubuntu.com/7826816。
    -aF'[\s,]+'
    (引用)“Tiago:我当时使用的是一台Windows机器,它要求它的参数以不同的方式引用。我手动将它转换为Linux风格,但无法测试它。
    -F[\s,]+
    不起作用。
    perl-aF',|\s+'-nE'$v=pop@F;shift@F;说“$\u$v”因为@F'文件能起作用,我不知道为什么。@Tiago:
    -a
    意味着
    -n
    。你应该使用
    -aF[\s,]+
    ,而不是
    -F[\s,]+
    @fedorqui:对不起,我明白了。修复了。很抱歉打扰你,但为什么会发生这种情况:paste.ubuntu.com/7826816。
    -aF'[\s,]+
    (引用)@Tiago:我当时使用的是一台Windows机器,它要求它的参数以不同的方式引用。我手动将它转换为Linux风格,但无法测试它。