1

キー値のみを含むファイルとともに、スペースで区切られたキーと値を含むフォルダーに複数のファイルがあります。すべてのファイルはキーに従ってソートされます。すべて同じキーを持っています。(キーの欠落もありません)。キーの後にすべての値が続くファイルが必要です(同じファイルから同じ列への値)

キーファイルは次のようになります。

00001740-a

00001740-n

00001740-r

00001740-v

00001837-r

00001930-n

00001981-r

00002098-a

残りのファイルは次のようになります。

00001740-a      5.21718e-05

00001740-n      3.32329e-05

00001740-r      4.5483e-06

00001740-v      7.54663e-05

00001837-r      8.79043e-06

00001930-n      3.75099e-06

00001981-r      1.4668e-06

00002098-a      3.18465e-06

参加のマニュアルページで何も見つかりませんでした。ここで私を助けてください。

man join:

NAME
       join - join lines of two files on a common field

SYNOPSIS join [OPTION]... FILE1 FILE2

更新 - 回答の1つとして言及されたコマンドを生成するシェルスクリプトを作成し、それを別のシェルファイルに出力してから実行しました。より良いアイデアはありますか?

 #!/bin/bash
 echo -n "paste offsets.txt "
 for f in *.ppv
 do
     echo -n " <(cut -f2 "$f")"
 done
4

4 に答える 4

3

次のコマンドを試してください。

join FILE1 FILE2 | join - FILE3 | join - FILE4
于 2013-02-21T09:14:47.990 に答える
2

どうですか:

paste keyfile <(cut -d' ' -f2 file1) <(cut -d' ' -f2 file2) ... <(cut -d' ' -f2 fileN)
于 2013-02-21T08:38:24.103 に答える
0

「eval」を使用してコマンドを実行できます。次に例を示します。

#!/bin/bash
first="1"
for f in *.ppv
do
    if [[ ${first} -eq "1" ]]; then
        command="join offset.txt ${f}"
        first="0"
    else
        command="${command} | join - ${f}"
    fi
done
eval ${command}
于 2013-02-24T06:58:26.503 に答える
0

データがメモリに収まるほど小さい場合は、次を試してください。

awk 'NF > 1{ a[$1] = a[$1] " " $2} END {for( i in a ) print i, a[i]}' *.ppv

これにより、キーが異なる順序で出力されるため、出力を にパイプすることをお勧めしますsort

于 2013-02-21T19:50:44.470 に答える