例如......
this is a line 2345
this is a line 1234
sed可以反转这些行(数字长度相同但文件中的行长度不同):
5432 enil a si siht
4321 enil a si siht
现在可以仅反转(不提取)数字,以便可以对数字进行排序:
2345 enil a si siht
1234 enil a si siht
然后再次反转前n个字符:
4321 enil a si siht
5432 enil a si siht
然后整行,按不均匀行末尾的数字对整个文件进行排序:
this is a line 1234
this is a line 2345
因为我无法使用sed对文件末尾的数字进行排序。
答案 0 :(得分:0)
在我对你的问题的解释中,你的行有不同数量的单词和最后的数字,你想要在最后对数字进行排序。如果是这样,请考虑以下示例文件:
$ cat File
this is a line 231
Another 312
a longer long with many words 123
要使用sed以数字方式对其进行排序,请尝试:
$ sed -E 's/.* ([[:digit:]]+)$/\1 &/' File | sort -n | sed 's/^[[:digit:]]* //'
a longer long with many words 123
this is a line 231
Another 312
答案 1 :(得分:0)
鉴于您的文件不包含'#'字符。您可以在数字前面插入这样的字符,并将其指定为排序分隔符,对该值进行排序,然后再将其删除:
cat tosort.txt | sed -r 's/ ([0-9]+)$/ #\1/' | sort -t'#' -k2 -n | sed 's/#//'
3 a longer long with many words 123
1 this is a line 231
2 Another 312
如果您的文件包含#,则可以选择另一个魔术分隔符。 如果输入文件发生更改,您可以在不包含此类字符之前对其进行测试,更进一步,为此目的自动搜索有用的字符。
我不知道为什么John删除了他的答案,将数字移到前面,对文件进行排序,然后再将其移回。似乎是一个更好的解决方案。
或者你真的想用sed排序吗?
要只使用前4位数字,您可以使用类似的内容:
sed -r 's/([0-9])([0-9])([0-9])([0-9]) (.*)/\4\3\2\1 \5/' toresort.txt
对于给定的更大数字的数字,您可以部分或全部自动生成此类表达式。
rfec () { n=$1; echo -n $g; if (( $n > 0 )) ; then rfec $(( n - 1 )); fi ; x=$1; echo -n '\$'$((9-x)); }
rfec 9
([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])\$9\$8\$7\$6\$5\$4\$3\$2\$1\$0
答案 2 :(得分:0)
这可能适合你(GNU sed):
sed -r 's/^(.{0})(.{4})/\1\n\2\n/;T;:a;s/\n(.)(.*\n)/\n\2\1/;ta;s/\n//g' file
这将反转一行的前四个字符(假设该行至少有四个字符)。
sed -r 's/([0-9]+)/\n&\n/;T;:a;s/\n(.)(.*\n)/\n\2\1/;ta;s/\n//g' file
这将反转一行上的第一组数字(一个或多个)。
上述组合可用于反转部分或整行。