如何从终端按行排序

如何从终端按行排序

我当时正在看这个问题 我想知道是否可以从终端执行以下操作。我在 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

这应该能满足您的要求。它将读取一个文件 (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

答案2

这是另一种 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

答案3

使用命令行脚本执行所需操作的唯一真正困难是可用的sort函数需要排序文件内的行, 而不是行内的字段。为了解决这个问题,您可以在函数之前逐行用换行符替换字段分隔符sort,然后在排序后在每一行中再次用分隔符替换换行符。

有许多可用的文本处理实用程序可以让你做到这一点(包括sed、,awk甚至简单的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

此单行代码有效:

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

相关内容