列から一意の値を抽出する方法

列から一意の値を抽出する方法

10,000列と117,000行のデータファイルがあります。私の元のデータには列ごとに多くの反復があります。それは同じです:

入力file.txt:

    123 124 111 
    321 124 111 
    123 000 111 
    123 111 222

各列の各値のコピーを保持したいと思います。たとえば、次のようになります。

    123 124 111
    321 000 222
        111 

10,000個の列があるため、すべての列を一緒に処理するプログラムが必要です。

答え1

これにより、5行のコードで必要な操作を実行できます(そのうち2行はクリーンアップ中です)。

#!/bin/bash
# run this, specifying input file as $1 (parameter 1)

# delete any pre-existing column files from /tmp
find /tmp -maxdepth 1 -name "column*" -delete

# create /tmp/columnN files - each file holds one column of $1
awk '{for (f=1; f<=NF; f++) {print $f >>"/tmp/column"f}}' "$1"

# iterate through column files, sorting and removing duplicates
find /tmp -maxdepth 1 -name "column*" -execdir sort -o \{\} -u \{\} \;

# re-combine columns and output to stdout
paste /tmp/column*

# delete column files from /tmp
find /tmp -maxdepth 1 -name "column*" -delete

(現在持っているものと同じ)列数が多いと、/ tmp / column *を完全に拡張できないため、貼り付けコマンドが失敗する可能性があります。

出力は各列の出力がソートされ、元の例では2番目の列がソートされないという点で例とは異なります。

関連情報