对文件进行排序,但将行对放在一起

对文件进行排序,但将行对放在一起

我有一个包含如下条目的文件:

female,9,13,6.3152956461
female,12,12,5.4797699786
female,11,11,3.6421699174
female,9,14,4.5933365997
female,8,14,2.4181574607

ETC。

我首先要删除除前两列之外的所有列,然后用空格而不是逗号将它们分开。但最终我的问题是我需要先按第 1 列排序,然后按第 2 列排序,但我必须保持给定行中的配对不变。

我相信我需要使用 sed 来切换列分隔符并使用 sort 来进行排序,但我不知道如何在两种排序之间保持行配对。

答案1

你的意思是这样吗?

$ sort -t, -k1,1 -k2,2n file
female,8,14,2.4181574607
female,9,13,6.3152956461
female,9,14,4.5933365997
female,11,11,3.6421699174
female,12,12,5.4797699786

这将按,字母顺序对第一个字段中的 -delimited 数据进行排序,然后按数字对第二个字段进行排序。排序时会首先使用第一个字段进行排序,对于第一个字段相同的记录,将使用第二个字段进行排序。


之后要删除最后几列(或者更确切地说,保留第 1 列和第 2 列):

$ sort -t, -k1,1 -k2,2n file | cut -d, -f1,2
female,8
female,9
female,9
female,11
female,12

也删除该逗号:

$ sort -t, -k1,1 -k2,2n file | cut -d, -f1,2 | tr ',' ' '
female 8
female 9
female 9
female 11
female 12

但显然,这对于排序来说不是必需的,因为您可以告诉sort要使用什么分隔符。

答案2

尝试这个

awk 'BEGIN {FS=","} {print $1, $2}' file | sort -k1,1 -nk2,2

解释

  1. 'BEGIN {FS=","} {print $1, $2}'- 将字段分隔符设置为,(默认为空格)并仅打印第一个 ( $1) 和第二个 ( $2) 字段;
  2. file- 你归档(你可以使用管道代替:)cat file | awk etc...
  3. sort -k1,1 -nk2,2- 按第一个字段 ( -k1,1) 和下一步排序 - 按第二个字段数字排序 ( -nk2,2)

让我们使您的示例复杂化(实际上您的第一个字段是相等的)。假设您有不同的输入文件,如下所示:

male,9,13,6.3152956461
female,12,12,5.4797699786
female,11,11,3.6421699174
male,9,14,4.5933365997
male,8,14,2.4181574607

输出将:

male 8
male 9
male 9
female 11
female 12

这是你需要的吗?

相关内容