列を個別に並べ替え、テキストファイル内で一意に並べ替えます。

列を個別に並べ替え、テキストファイル内で一意に並べ替えます。

次のファイルがあります。

D F T E
A R T E
K A O E
E T P J

各列を並べ替え、次のように各列を個別に設定したいと思います。

A A O E
D F P J
E R T
K T

sortやuniqを使ってこれを行う方法を知っている人がいるかどうか疑問に思います。

答え1

次のように試すことができます。

paste -d'\t' <(cut -f 1 -d' ' file | sort -u) <(cut -f 2 -d' ' file | sort -u) <(cut -f 3 -d' ' file | sort -u) <(cut -f 4 -d' ' file | sort -u) >output

出力をより良く見せるために区切りtab記号として使用します。paste

答え2

(いいね回答の貼り付け/切り取り@taliezin。これは多くの列に対するより一般的な解決策です。データを1列に1つのファイルに分割し、ファイルを並べ替え、再度ファイルにマージします。たとえば、列 2 が列 3 より短い場合、固定幅の列が 1 文字であるとします。このデモにはdata0初期ファイルがあります。

for i in {1..4}
do  awk -v i=$i '{ch = substr($0,i*2-1,1);if(ch!=" ")print ch}' </tmp/data0 |
    sort -u >/tmp/data$i
done
awk -v rows=$(wc -l </tmp/data0) '
BEGIN{
    for(i=1;i<=4;i++)
       file[i] = "/tmp/data" i
    while(rows-->0){
        for(i=1;i<=4;i++){
             d = ""
             getline d <file[i]
             printf("%1s ",d)
        }
        printf "\n"
    }
}' </dev/null

関連情報