我有一个包含如下条目的文件:
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
解释:
'BEGIN {FS=","} {print $1, $2}'
- 将字段分隔符设置为,
(默认为空格)并仅打印第一个 ($1
) 和第二个 ($2
) 字段;file
- 你归档(你可以使用管道代替:)cat file | awk etc...
;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
这是你需要的吗?