我有以下名为“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
我需要使用cut
andsort
来仅显示具有 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