按给定顺序重新排序文件行

L3v*_*han 1 bash file-io

我有一个文件A,其中包含n行.我还有一个n个整数的序列,所有这些都是唯一的并且< n.我的目标是创建一个文档B,它具有与A相同的内容,但具有基于给定序列的重新排序的行.

例:

:

Foo
Bar
Bat
Run Code Online (Sandbox Code Playgroud)

顺序:( 2,0,1意思是:第一行2,然后行0,然后行1)

输出(B):

Bat
Foo
Bar
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助

Joh*_*ohn 5

另一种方案:

您可以通过执行创建序列文件(假设序列以逗号分隔):

echo $sequence | sed s/,/\\n/g > seq.txt
Run Code Online (Sandbox Code Playgroud)

然后,就这样做:

paste seq.txt A.txt | sort tmp2.txt | sed "s/^[0-9]*\s//"
Run Code Online (Sandbox Code Playgroud)

这是一个bash函数.订单可以由任何东西分隔.

用法: schwartzianTransform "A.txt" 2 0 1

function schwartzianTransform {
    local file="$1"
    shift
    local sequence="$@"
    echo -n "$sequence" | sed 's/[^[:digit:]][^[:digit:]]*/\
/g' | paste -d ' ' - "$file" | sort -n | sed 's/^[[:digit:]]* //'
}
Run Code Online (Sandbox Code Playgroud)

  • 除了其他名称之外,这已知为[Schwartzian变换](http://en.wikipedia.org/wiki/Schwartzian_transform). (4认同)