Linux 对多列进行排序和剪切

Linux 对多列进行排序和剪切

我有以下名为“info”的文件:

White:73:Mars:1543:Manuel
Green:17:Jupiter:1968:Sebastian
Blue:24:Venus:1970:Anna
Red:35:Neptune:1122:Javier
Yellow:135:Earth:1234:Raymond

我需要使用cutandsort来仅显示具有 planest 和名称的列(已排序)。这意味着我必须留下:

Earth:Anna
Jupiter:Javier
Mars:Manuel
Neptune:Raymond
Venus:Sebastian

我尝试使用 cut -d: -f3,5 info | sort -t: -k1,1 -k2,2 ,但它只对第一列进行排序,而不对第二列进行排序。

我也尝试过, cut -d: -f3,5 info | sort -t: -k1,1 -k2,2 | sort -t: -k2,2 但这只对第二列进行了排序。

感谢任何和所有的帮助

答案1

单独对列进行排序:

paste -d: <(cut -d: -f3 info | sort) <(cut -d: -f5 info | sort)
Earth:Anna
Jupiter:Javier
Mars:Manuel
Neptune:Raymond
Venus:Sebastian

答案2

由于结果由两个单独排序的数据列组成,因此需要两次调用sort,每个调用都有一组单独的数据。

内扎布德卡的回答展示了如何在理解进程替换的 shell 中执行此操作:

paste -d : \
    <( cut -d : -f 3 info | sort ) \
    <( cut -d : -f 5 info | sort ) \
    >outfile

上面假设您要将输出保存到名为outfile.

在不理解进程替换的 shell 中(您在问题中没有提到特定的 shell),可以使用中间文件分两步执行此操作:

cut -d : -f 3 info | sort > outfile.tmp
cut -d : -f 5 info | sort | paste -d : outfile.tmp - >outfile
rm outfile.tmp

第一个管道创建行星排序名称的初始列。它将排序后的数据重定向到文件outfile.tmp。第二条管道以与第一列类似的方式创建第二列,并使用 将其附加到第一列paste。然后我们删除中间文件。

答案3

使用而且它是内置的数组排序功能,我们只需要一次遍历文件。

gawk '
  BEGIN { FS = OFS = ":" }
  {
    planet[NR] = $3
    name[NR] = $5
  }
  END {
    asort(planet)
    asort(name)
    for (i=1; i <= NR; i++) print planet[i], name[i]
  }
' info

答案4

step1: awk -F ":" '{print $3}' inpfile | sort -k1.1 >out.txt; awk -F ":" '{print $5}' inpfile |sort -k1.1 >out_1.txt

step2: paste -d ":" out.txt out_1.txt

输出

Earth:Anna
Jupiter:Javier
Mars:Manuel
Neptune:Raymond
Venus:Sebastian

相关内容