我有一个字符串“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
但是上面的命令不起作用,我不知道为什么。
答案 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