0

以下に入力ファイルがある場合、Linux でこれを次のように目的のファイルに変換するコマンド/方法はありますか?

入力ファイル:

Column_1     Column_2  
scaffold_A   SNP_marker1
scaffold_A   SNP_marker2
scaffold_A   SNP_marker3
scaffold_A   SNP_marker4
scaffold_B   SNP_marker5
scaffold_B   SNP_marker6
scaffold_B   SNP_marker7
scaffold_C   SNP_marker8
scaffold_A   SNP_marker9
scaffold_A   SNP_marker10

目的の出力ファイル:

Column_1     Column_2  
scaffold_A   SNP_marker1;SNP_marker2;SNP_marker3;SNP_marker4
scaffold_B   SNP_marker5;SNP_marker6;SNP_marker7
scaffold_C   SNP_marker8
scaffold_A   SNP_marker9;SNP_marker10

grep や uniq などを使用することを考えていましたが、これを行う方法がわかりませんでした。

4

5 に答える 5

2

Perl ソリューション:

perl -lane 'sub output {
                print "$last\t", join ";", @buff;
            }
            $last //= $F[0];
            if ($F[0] ne $last) {
               output();
               undef @buff;
               $last = $F[0];
            }
            push @buff, $F[1];
            }{ output();'
于 2013-07-24T11:37:42.660 に答える
0

Python を使用してもかまわない場合はitertools.groupby、この目的に役立つがあります。

# file: comebine.py
import itertools

with open('data.txt') as f:
    data = [row.split() for row in f]

for column1, rows_group in itertools.groupby(data, key=lambda row: row[0]):
    print column1, ';'.join(column2 for column1, column2 in rows_group)

このスクリプトを結合.pyとして保存します。入力ファイルがdata.txtにあると仮定し、それを実行して目的の出力を取得します。

python combine.py

討論

  • with open(...)ブロックの結果は、data行のリストであり、各行自体は列のリストです。
  • このitertools.groupby関数はイテラブル (この場合はリスト) を受け取ります。column1 というキーを使用して行をグループ化する方法を指定します。
  • rows_group は同じ column1 を共有する行のリストです
于 2013-08-02T16:03:52.810 に答える
0

bash スクリプト内の awk ソリューション

#!/bin/bash 

awk '
BEGIN{
    str = ""
}
{
    if ( str != $1 ) {
        if ( NR != 1 ){
            printf("\n")
        }
        str = $1
        printf("%s\t%s",$1,$2)
    } else if ( str == $1 ) {
        printf(";%s",$2)
    }
}
END{
        printf("\n")
}' your_file.txt
于 2013-07-24T13:19:28.447 に答える
0

また、bash で次のソリューションを試すこともできます。

cat input.txt | while read L; do y=`echo $L | cut -f1 -d' '`; { test "$x" = "$y" && echo -n ";`echo $L | cut -f2 -d' '`"; } || { x="$y";echo -en "\n$L"; }; done

または人間が読みやすい形式で確認します。

cat input.txt | while read L;
do
  y=`echo $L | cut -f1 -d' '`;
  {
    test "$x" = "$y" && echo -n ";`echo $L | cut -f2 -d' '`";
  } || 
  {
    x="$y";echo -en "\n$L"; 
  };
done

スクリプトを実行した結果の適切な形式の出力は、コマンドに基づいていることに注意してくださいbash echo

于 2013-07-31T11:31:36.673 に答える