我有一个格式为
的文件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。任何想法?
答案 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