在文本文件中单独对列进行排序和 uniq

在文本文件中单独对列进行排序和 uniq

我有一个文件如下:

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 个字符,以应对第 2 列比第 3 列短的情况。在这个演示中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

相关内容