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

Bash 如何使用Unix shell对文本文件中的行任意重新排序?,bash,shell,text,ksh,Bash,Shell,Text,Ksh,我有一个任意行数的文本文件,例如: one line some other line an additional line one more here 我想写一个脚本,根据给定的顺序对这些行重新排序。e、 g 输入2 1 3 4将交换第一行和第二行 输入3 1 2 4会将第3行放在第一位,第1行放在第二位,第2行放在第三位,第4行放在第四位 我可以拼凑一些东西,但我想知道是否有一个优雅的解决方案 我可以使用bash或ksh。您可以使用sed: for num in $input ; do

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

one line
some other line
an additional line
one more here
我想写一个脚本,根据给定的顺序对这些行重新排序。e、 g

  • 输入2 1 3 4将交换第一行和第二行
  • 输入3 1 2 4会将第3行放在第一位,第1行放在第二位,第2行放在第三位,第4行放在第四位
我可以拼凑一些东西,但我想知道是否有一个优雅的解决方案


我可以使用bash或ksh。

您可以使用
sed

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

您可以使用
sed

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

下面是一个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];
}
#/usr/bin/perl-w
我的@lines=#将stdin读入数组
foreach my$linenum(@ARGV){#从参数列表中获取新的顺序
打印$lines[$linenum-1];
}
以以下方式运行脚本:

./scriptname 2 1 3 4 < inputfile
/scriptname 2 1 3 4
下面是一个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];
}
#/usr/bin/perl-w
我的@lines=#将stdin读入数组
foreach my$linenum(@ARGV){#从参数列表中获取新的顺序
打印$lines[$linenum-1];
}
以以下方式运行脚本:

./scriptname 2 1 3 4 < inputfile
/scriptname 2 1 3 4在awk中:

for num in "$@"; do
    awk "NF==$num" file
done
仅Bash(如果将其放入脚本中,则不需要重置IFS):

IFS=$”\n
行=($(在awk中:

for num in "$@"; do
    awk "NF==$num" file
done
仅Bash(如果将其放入脚本中,则不需要重置IFS):

IFS=$”\n

行=($(
用于${input[@]}中的num;do sed“$num!d”文件;done
给出错误
-bash:!d”:未找到事件
用于${input[@]}中的num;do sed“$num!d”文件;done
给出错误
sed:-e表达式#1,字符3:命令后的额外字符
其中input[0]=2,input[1]=1,input[2]=3当您以交互方式尝试此操作时,您需要将
转义为
\!
,因为它用于历史替换。他给您的代码应该在脚本中工作。转义不以交互方式工作。我稍微修改了choroba的代码,使其在命令行和脚本中都能工作。
用于8 3 4 5 6 7 2 9 1中的n0 1;do sed$n'!d'/tmp/xs1。$$;done
重新排序tmp文件中的10行:)感谢${input[@]}中的num;do sed“$num!d”文件;done
给出错误
-bash:!d”:未找到事件
对于${input[@]中的num;do sed'$num!d'文件;done
给出错误
sed:-e表达式#1,字符3:命令后的额外字符
其中输入[0]=2,输入[1]=1,输入[2]=3当您以交互方式尝试此操作时,您需要将
转义为
\!
,因为它用于历史替换。他给您的代码应该在脚本中工作。转义不以交互方式工作。我稍微修改了choroba的代码,使其在命令行和脚本中都能工作。
用于8 3 4 5 6 7 2 9 1中的n0 1;执行sed$n'!d'/tmp/xs1。$$;完成
对tmp文件中的10行重新排序:)谢谢