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