假设这样一个输入文件:
A sentence X
Z matching sentence Y
A sentence Z
B matching sentence N
A sentence Z
M matching sentence N
你可以两者都做交换,并与的Perl排序:
perl -lne'
$_{ $_ } = $v unless $. % 2;
$v = $_;
END {
print $_, $/, $_{ $_ }
for sort keys %_;
}' infile
我得到的输出是:
% perl -lne'
$_{ $_ } = $v unless $. % 2;
$v = $_;
END {
print $_, $/, $_{ $_ }
for sort keys %_;
}' infile
B matching sentence N
A sentence Z
M matching sentence N
A sentence Z
Z matching sentence Y
A sentence X
如果您想在第一行订购(交换前):
perl -lne'
$_{ $_ } = $v unless $. % 2;
$v = $_;
END {
print $_, $/, $_{ $_ }
for sort {
$_{ $a } cmp $_{ $b }
} keys %_;
}' infile
所以,如果原来的文件看起来像这样:
% cat infile1
me
watashi
hello
annyonghaseyo
Good morning!
dobroye utro!
输出应该是这样的:
% perl -lne'
$_{ $_ } = $v unless $. % 2;
$v = $_;
END {
print $_, $/, $_{ $_ }
for sort {
$_{ $a } cmp $_{ $b }
} keys %_;
}' infile1
dobroye utro!
Good morning!
annyonghaseyo
hello
watashi
me
这个版本应该正确处理重复的记录:
perl -lne'
$_{ $_, $. } = $v unless $. % 2;
$v = $_;
END {
print substr($_, 0, length() - 1) , $/, $_{ $_ }
for sort {
$_{ $a } cmp $_{ $b }
} keys %_;
}' infile
而另一个版本,inspi红通过张贴格伦解决方案(记录交换包括假设模式_ZZ_没有出现在文本文件中):
sed 'N;
s/\(.*\)\n\(.*\)/\1_ZZ_\2/' infile |
sort |
sed 's/\(.*\)_ZZ_\(.*\)/\2\
\1/'
谢谢 - 这个工作就像黄金!是否可以根据第一行的第一个字母按字母顺序重新排列?另外,看起来文件大小在这之后跳跃了大约30%,可能插入了一些符号?我没有看到任何空格等。我在vim中使用“:%s/\ s \ + $ //”删除所有尾随空白。编辑:如果有问题,我通过> output.txt保存了输出。 –
@Google,你可以发布一个更大的你的输入样本和一个期望输出的例子(根据最后的订购要求)? –
我更新了最初的问题 - 我希望它很清楚。如果不让我知道。 –