2

n行を含むドキュメントAがあります。また、 n個の整数のシーケンスがあり、それらはすべて一意で< nです。私の目標は、 Aと同じ内容であるが、指定された順序に基づいて行が並べ替えられたドキュメントBを作成することです。

例:

A

Foo
Bar
Bat

シーケンス:(2,0,1意味:最初の2行目、次に0行目、次に1行目)

出力(B):

Bat
Foo
Bar

助けてくれてありがとう

4

4 に答える 4

5

別の解決策:

次のようにしてシーケンスファイルを作成できます(シーケンスがコンマで区切られていると仮定)。

echo $sequence | sed s/,/\\n/g > seq.txt

次に、次のようにします。

paste seq.txt A.txt | sort tmp2.txt | sed "s/^[0-9]*\s//"

これが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:]]* //'
}
于 2013-03-26T15:38:28.363 に答える
1

1つの方法(大きなファイルの場合は効率的ではありません):

$ seq="2 0 1"
$ for i in $seq
> do
>   awk -v l="$i" 'NR==l+1' file
> done
Bat
Foo
Bar

ファイルが大きい場合は、次のファイルを使用できます。

$ seq='2,0,1'
$ x=$(echo $seq | awk '{printf "%dp;", $0+1;print $0+1> "tn.txt"}' RS=,)
$ sed -n "$x" file | awk 'NR==FNR{a[++i]=$0;next}{print a[$0]}' - tn.txt

2行目はsedコマンドの印刷命令を準備し、3行目でsedコマンドとともに使用されます。これにより、シーケンスに存在する行番号のみが出力され、シーケンスの順序では出力されません。awkコマンドは、シーケンスに応じてsedの結果を並べ替えるために使用されます。

于 2013-03-26T14:54:27.350 に答える
1

ファイルを配列に読み込んでから、インデックス作成の機能を使用します。

echo "Enter the input file name"
read ip

index=0

while read line ; do
        NAME[$index]="$line"
            index=$(($index+1))
            done < $ip

echo "Enter the file having order"
read od

while read line ; do
        echo "${NAME[$line]}";
            done < $od

[aman@aman sh]$ cat test 
Foo
Bar
Bat
[aman@aman sh]$ cat od
2
0
1
[aman@aman sh]$ ./order.sh 
Enter the input file name
test
Enter the file having order
od
Bat
Foo
Bar
于 2013-03-26T14:56:31.557 に答える
1

awkワンライナーはその仕事をすることができます:

 awk -vs="$s" '{d[NR-1]=$0}END{split(s,a,",");for(i=1;i<=length(a);i++)print d[a[i]]}'  file

$sあなたのシーケンスです。

この例を見てください:

kent$  seq 10 >file  #get a 10 lines file

kent$  s=$(seq 0 9 |shuf|tr '\n' ','|sed 's/,$//') # get a random sequence by shuf

kent$  echo $s     #check the sequence in var $s
7,9,1,0,5,4,3,8,6,2 

kent$  awk -vs="$s" '{d[NR-1]=$0}END{split(s,a,",");for(i=1;i<=length(a);i++)print d[a[i]]}'  file                                                                          
8
10
2
1
6
5
4
9
7
3
于 2013-03-26T15:03:43.030 に答える