假設這樣一個輸入文件:
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,你可以發佈一個更大的你的輸入樣本和一個期望輸出的例子(根據最後的訂購要求)? –
我更新了最初的問題 - 我希望它很清楚。如果不讓我知道。 –