帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:命令行  TERM  sort  Comma  COMM  终端  COM  

问题:

这个问题,我看了一下,我想知道下面是否能从终端完成。 我是在 python 中做的,只是想看看它是否可以从终端。bash脚本或者任何一种。

假设我有一个类似这样的文件:


2,4,5,14,9


40,3,5,10,1



是否可以按行( 行) 排序


2,4,5,9,14


1,3,5,10,40



还是太复杂了? 我用 python 做的,我只是想知道,下次我不使用 python 时,它是否能做到。 我所做的是创建列表并排序它们。


回答 1:

下面是另一种Perl方法:


perl -F, -lane 'print join",",sort {$a<=>$b} @F' file.txt



另一个 shell/coreutils一个( 尽管我个人喜欢,但我更喜欢使用同样的思想的steeldriver优秀的答案):


while read line; do 


 tr, $'n' <<(printf --"%s""$line") | sort -g | tr $'n', | sed 's/,$/n/';


done <file.txt




回答 2:

这应该与你正在寻找的有关。 它将读取文件( test.txt ),并以与原始文件中显示的顺序同样的顺序创建一个输出文件( sorted.txt )。


while read line; do j=$(echo"$line" | sed -e 's/,/n/g' | sort -n); echo"$j" 


 | sed -e 's//,/g'>> sorted.txt; done <test.txt




回答 3:

在使用命令行脚本时,惟一真正的困难是可用的sort 函数需要对文件行排序,而不是在一行代码中的非文本字段。 为了解决这一问题,可以将字段分隔符line-by-line替换为 sort 函数之前的换行符,然后在排序后替换换行符。

有许多可以用的文本处理实用工具,可以使你完成( 包括 sedawk,甚至是简单的tr ),但 bash shell 本身现在可以做很多。 假设你的输入是逗号分隔的( 示例中有一个逗号和空格分隔符混合在一起),你可以执行以下操作:


while read line; do 


 sorted=$(sort -g -- <<<"${line//,/$'n'}")


 printf --"${sorted//$'n'/,}n"


done <file



在输入字符串中,你需要处理空格分隔符,然后你可以将它们作为字符列表 [, ]的一部分添加到输入子字符串的替换中:


while read line; do 


 sorted=$(sort -g -- <<<"${line//[, ]/$'n'}")


 printf --"${sorted//$'n'/,}n"


done <file



( 请注意,输出仍然是严格逗号分隔的)。


回答 4:

python -c"your code here" input.txt

或者,如果程序有多行,且 eval() 太慢:

python yourprogram.py input.txt

这里oneliner有效:


python -c"for l in open('input.txt'):print(','.join(sorted(l.strip().split(','), key=int)))"




回答 5:

使用tr和 sed

类似于所写的jkt123:


while read i; do tr, n < <<$i | sort -n | tr n, | sed 's/,$//'; done



对行进行迭代,每行用换行替换逗号,然后将结果行数字化,然后将换行符转换为逗号。 主要问题是,这将使用逗号而不是一个换行符来结束整个结果。 它去掉最后一个逗号,并且implicitely在输出中添加一个换行符。

使用bash数组

以下是处理这里"用逗号连接"问题的另一种方法:


while read i; do j=( $(tr, n < <<$i | sort -n) ); ( IFS=,; echo"${j[*]}"; ); done



或者用换行方式书写:


while read i


do


 j=( $(tr, n < <<$i | sort -n) )


 ( IFS=,; echo"${j[*]}"; )


done



它使用 bash array 存储排序行的结果,并使用bash将数组扩展到使用 IFS 特殊变量的字符串文本。


回答 6:

这是 awk的解决方案


while read -r line; do (echo $line | awk '{ n=split($1,a,","); asort(a); for(i=0;i<=n;i++) { print a[i];}}') | xargs | sed -e 's//,/g'; done <text.txt



解释:

  • awk '{ n=split($1,a,","); asort(a); for(i=0;i<=n;i++) { print a[i];}}'

    awk根据分隔符 , 分割字段 1并将每个值存储到 array a 中,最后的位置存储在变量 n 中。 下一个 asort(a) 函数在awk命令中向下排序 array 循环prints命令按记录格式打印排序值。

  • xargs | sed -e 's//,/g'

    xargs 将所有行合并为一行。

  • sed -e 's//,/g'

    它用逗号 , 替换空格

  • while read -r line;

    while 循环的帮助下,上述 awkxargssed 函数都是逐行完成的。


回答 7:

你可以使用perl轻松做到这一点

考虑到文件 text.txt


cat text.txt



1,5,7,8,3,6


10,34,67,1,2,0,5



下面的perl代码将对 text.txt 中的行进行排序


 perl -i -e 'while(<>){chomp; my @sorted = sort { $a <=> $b } split(",", $_); print join (",", @sorted); print"n"}' text.txt



排序后


cat text.txt



1,3,5,6,7,8


0,1,2,5,10,34,67




回答 8:

使用 perl oneliner的最短解决方案:


perl -ne 'print join(",", sort { $a <=> $b } split(/,|n/))."n"' text.txt




回答 9:

我也需要这个功能,我找到的解决方案如下( 假设数据处于测试文件中):


cat test | while read line; do echo $(echo $line | datamash -t',' transpose |sort -g| datamash -t',' transpose); done






文章标签:COM  COMM  Comma  命令行  TERM  终端  sort  

Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语