如何使用Unix shell任意重新排序文本文件中的行?

时间:2012-11-01 10:51:53

标签: bash shell text ksh

我有一个任意行数的文本文件,例如:

one line
some other line
an additional line
one more here

我想写一个脚本来根据给定的顺序重新排序这些行。例如

  • 输入2 1 3 4将交换第一行和第二行。
  • 输入3 1 2 4将第3行放在第1行,第1行放在第2行,第2行放在第3行,并保留第4行第4行。

我可以一起破解某些东西,但我想知道是否有一个优雅的解决方案?

我可以使用bash或ksh。

3 个答案:

答案 0 :(得分:4)

您可以使用sed

for num in $input ; do
    sed $num'!d' file
done

答案 1 :(得分:2)

这是一个perl解决方案:

#!/usr/bin/perl -w
my @lines = <STDIN>; # Read stdin into an array
foreach my $linenum (@ARGV) { # Get the new order from argument list
  print $lines[$linenum-1];
}

将脚本运行为:

./scriptname 2 1 3 4 < inputfile

答案 2 :(得分:1)

在awk中:

for num in "$@"; do
    awk "NF==$num" file
done

仅限Bash(如果您将其放入脚本中,则无需重置IFS):

IFS=$'\n'
lines=( $(<file) )
for num in "$@"; do
    echo lines[num-1]
done