次のファイルがあります。
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