1

列1の同じエントリを共有する行について、ファイルの行を連結する方法(複数の列と行、>100MBのファイル)を知りたいです。また、このように連結されたファイルを連結解除する方法も知りたいです。

例:

file.txt から:

a 3494 3929 asd 12 fdfdf
b 2323 2390 kjk 32 kjkjk
b 1323 2390 kjk 32 kjkjk
c 2399 9009 dfd 90 sasd
c 9090 1212 jkk 01 kjkk
c 0900 2311 gfg 09 dkjs
d 0909 2322 kjk 98 dskk
d 0909 0903 kjk 98 dskk
d 0909 2422 fdd 98 cvcv

to, concatenatedfile.txt

a 3494 3929 asd 12 fdfdf
b 2323 2390 kjk 32 kjkjk b 1323 2390 kjk 32 kjkjk
c 2399 9009 dfd 90 sasd c 9090 1212 jkk 01 kjkk c 0900 2311 gfg 09 dkjs
d 0909 2322 kjk 98 dskk d 0909 0903 kjk 98 dskk d 0909 2422 fdd 98 cvcv

逆に、次のようになります: from concatenatedfile.txt -> file.txt

4

3 に答える 3

0

フィールド1が連続した順序である場合は、配列を使用しない代替方法を試してください。

awk 'END{print RS} p!=$1{if(p)print RS; p=$1}1' ORS= file

逆の場合は、次のようにしてみてください。

awk '{for(i=2; i<=NF; i+=1) if( $i==$1 ) $i=RS $i}1' file

ただし、他のフィールドの1つが再構築されたレコードの最初のフィールドと同じ値を持つ可能性がある場合は失敗します。その場合、追加のチェックが必要になります。

于 2013-02-19T21:20:28.640 に答える
0

では、連結解除は非常に簡単ですawk

awk 'NF % 6 != 0 { print "Garbage: ", $0 }
     NF % 6 == 0 { for (i = 1; i < NF; i += 6)
                   {
                       pad = ""
                       for (j = i; j < i+6; j++)
                       {
                           printf "%s%s", pad, $j
                           pad = " "
                       }
                       print ""
                   }
                 }'

そして、これが私の連結ソリューションです。列 1 の値がグループ化されていることを前提としています。それらがグループ化されていなくても、実際には気にしません。データがグループ化されていれば実行されなかった余分な行が生成されるだけです。

awk 'NF % 6 != 0 { printf "\nGarbage: %s\n", $0 }
     NF % 6 == 0 { if ($1 != old && NR > 1) print ""
                   if ($1 != old) printf "%s", $0
                   else           printf " %s", $0
                   old = $1
                 }
     END         { print "" }'

必要に応じてガベージ処理を省略できます — 一致しないデータを静かに無視します。

于 2013-02-19T22:17:58.017 に答える
0

これを試してください (> 100MO RAM が必要です):

awk '
    {for (i=2; i<=NF; i++) arr[$1]=arr[$1]" "$i}
    END{for (a in arr) print a, arr[a]}
' file.txt

出力

a  3494 3929 asd 12 fdfdf
b  2323 2390 kjk 32 kjkjk 1323 2390 kjk 32 kjkjk
c  2399 9009 dfd 90 sasd 9090 1212 jkk 01 kjkk 0900 2311 gfg 09 dkjs
d  0909 2322 kjk 98 dskk 0909 0903 kjk 98 dskk 0909 2422 fdd 98 cvcv
于 2013-02-19T18:40:04.943 に答える