1

一部のフィールドが一致する 1 行にデータを結合しようとしています。

12345,this,is,one,line,1
13567,this,is,another,line,3
14689,and,this,is,another,6
12345,this,is,one,line,4
14689,and,this,is,another,10

出力

12345,this,is,one,line,1,4
13567,this,is,another,line,3
14689,and,this,is,another,6,10

ありがとう

4

2 に答える 2

2
awk -F',' '{if($1 in a) {a[$1]=a[$1] "," $NF} else {a[$1]=$0}} END {asort(a); for(i in a) print a[i]}' < input.txt

与えられた例でうまく機能します。

これは、同じ awk スクリプトparse.awkのコメント付きファイル バージョンです。このバージョンでは、統一された行インジケーターとして最初のフィールドのみを使用することに注意してください。上記の著者のコメントに従って書き直します(最後のフィールドを除くすべてのフィールド)。

#!/usr/bin/awk -f

BEGIN { # BEGIN セクションは、入力ファイルのコンテンツの前に 1 回実行されます
    FS="," # 入力フィールド区切り文字はカンマ (コマンドラインで -F 引数で設定可能)
}

{ # メイン セクションはすべての入力行で実行されます
    if($1 in a) { # このチェックは、配列 'a' が最初のフィールドにインデックスを持つ要素を既に含んでいることを確認します
        a[$1]=a[$1] "," $NF # エントリが既に存在する場合は、現在の行の最後のフィールドを連結するだけです
    }
    else { # この行に新しいエントリが含まれている場合
        a[$1]=$0 # 新しい配列要素として追加
    }
}

END { # END セクションは最終行の後に 1 回実行されます
    asort(a) # 配列 'a' をその値で並べ替える
    for(i in a) print a[i] # このループはソートされた配列を通過し、その内容を出力します
}

これを経由して使用する

./parse.awk input.txt

行を比較するために最後のフィールドを除くすべてを使用する別のバージョンを次に示します。

#!/usr/bin/awk -f

BEGIN { # BEGIN セクションは、入力ファイルのコンテンツの前に 1 回実行されます
    FS="," # 入力フィールド区切り文字はカンマ (コマンドラインで -F 引数で設定可能)
}

{ # メイン セクションはすべての入力行で実行されます
    idx="" # インデックス変数をリセット
    for(i=1;i<NF;++i) idx=idx $i # 最後のフィールドを除くすべてを結合してインデックスを作成します
    if(idx in a) { # このチェックは、配列 'a' が最初のフィールドにインデックスを持つ要素を既に含んでいることを確認します
        a[idx]=a[idx] "," $NF # エントリが既に存在する場合は、現在の行の最後のフィールドを連結するだけです
    }
    else { # この行に新しいエントリが含まれている場合
        a[idx]=$0 # 新しい配列要素として追加
    }
}

END { # END セクションは最終行の後に 1 回実行されます
    asort(a) # 配列 'a' を値で並べ替える
    for(i in a) print a[i] # このループはソートされた配列を通過し、その内容を出力します
}

追加の説明をお気軽にお尋ねください。

于 2012-07-22T06:18:25.413 に答える
0

これはうまくいくかもしれません(GNU sedとsort):

sort -nt, -k1,1 -k6,6 file | 
sed ':a;$!N;s/^\(\([^,]*,\).*\)\n\2.*,/\1,/;ta;P;D'
于 2012-07-22T06:29:50.760 に答える