如何采取成对的行和连接?

时间:2014-05-05 22:52:04

标签: linux perl shell text

我有一个格式为

的文件
instance1 field1
instance1 field2
instance2 field1
instance2 field2
instance3 field1
instance3 field2
...

我希望有一个oneliner,以便它转换为:

instance1 field1 field2
instance2 field1 field2
instance3 field1 field3

我可以编写以下类型的perl脚本:

while (<STDIN>)
{
 $line = $_;
 $line2 = <STDIN>;
 chomp $line; chomp $line2;
 print "$line $line2\n";
}

但我宁愿有一个oneliner。任何想法?

6 个答案:

答案 0 :(得分:1)

使用行号$.的两个解决方案:

perl -lane 'print $. % 2 ? @F[0,1] : " $F[1]\n"' file

或者

perl -pe '$. % 2 ? chomp : s/\S*//' file

答案 1 :(得分:0)

sed和awk:

sed '$!N;s/\n/ /' file.txt | awk '{print $1, $2, $4}'

答案 2 :(得分:0)

这个perl单行是一个触摸长但它有效。

perl -ne 'BEGIN{%h}{chomp;($k,$v) = split(/\s/,$_);$h{$k} .= qq( $v)}END{foreach( sort keys %h){print qq($_$h{$_}\n)}}' file

加分:解决方案允许您在未来更新脚本的情况下拥有两(2)个以上的字段。

答案 3 :(得分:0)

使用gnu sed

sed 'N;s/\n/ /;s/ \w*//2' file

使用awk

awk '{printf (NR%2)?$0 FS:$2 RS}' file

答案 4 :(得分:0)

你可能不是这个通用的东西,但以防万一,第一个字段的下列组:

perl -lane'
   push @{ $i{ $F[0] } }, $F[1];
   END {
      print join "\t", $_, @{ $i{$_} }
         for sort keys %i;
   }
'

答案 5 :(得分:0)

使用paste和GNU cut

<file paste -d ' '  - - | cut --complement -f3 -d ' '
instance1 field1 field2
instance2 field1 field2
instance3 field1 field2