我有一个文件如下:
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