在Linux中排序

时间:2012-01-27 04:26:26

标签: linux sorting

我有一个字符串“abc”,我在shell的目录中的15个文件中使用它。 当我在我的15个文件中grep "abc"时,它返回了我的文件的整行,如下所示:

abc 0.2  9.0
abc 0.01 8.0
abc 0.06 9.4
abc 0.02 8.7

现在我想根据第二列按照升序对此输出进行排序。

所以我写了这样的命令:

grep "abc" *.txt | sort -nr -t_ -k2

但是上面的命令不起作用,我不知道为什么。

4 个答案:

答案 0 :(得分:3)

您的命令无效,因为没有下划线分隔列;此外,您希望数据升序,但您告诉它按反向(降序)排序。使用:

grep "abc" *.txt | sort -n -k 2

或者:

grep "abc" *.txt | sort -k 2n

请注意,如果有多个文件,则grep输出将以文件名为前缀。你必须决定这是否重要。如果任何文件名中有空格,它只会搞砸。 -h的{​​{1}}选项会抑制文件名。

答案 1 :(得分:2)

我建议删除-t_参数,因为我看到你使用空格作为分隔符,而不是下划线。之后它对我有用:

$ cat t | sort -n -k2
abc 0.01 8.0
abc 0.02 8.7
abc 0.06 9.4
abc 0.2  9.0

更新:是的,正如@ jonathan-leffler所说,您还应该省略-r选项以按升序排序。

答案 2 :(得分:1)

您可以通过拨打grep

来替换整个脚本,包括拨打awk的电话
awk '/abc/{a[$2,i++]=$0}END{l=asorti(a,b);for(i=1;i<=l;i++)print a[b[i]]}' *.txt

实施例

$ ls *.txt
four.txt  one.txt  three.txt  two.txt

$ cat *.txt
abc 0.02 8.3
foo
abc 0.06 9.4
bar
blah blah
abc 0.2  9.0
blah
abc 0.01 8.0
blah
abc 0.02 8.7
blah blah

$ awk '/abc/{a[$2,i++]=$0}END{l=asorti(a,b);for(i=1;i<=l;i++)print a[b[i]]}' *.txt
abc 0.01 8.0
abc 0.02 8.3
abc 0.02 8.7
abc 0.06 9.4
abc 0.2  9.0

答案 3 :(得分:0)

第一个问题:您已使用-t_指定字段分隔符,但输出中不包含_个字符。

下一个问题:-k选项有两个参数,start field和end field。通过省略结束字段,默认情况下会得到end_of_line。

我建议这样写:

grep "abc" *.txt | sort -nr -k2,2