我有一个文件parse.txt
parse.txt包含以下内容
remo/hello/1.0,remo/hello2/2.0,remo/hello3/3.0,whitney/hello/1.0,julie/hello/2.0,julie/hello/3.0
Run Code Online (Sandbox Code Playgroud)
我想使用parse.txt将output.txt文件作为(从最后一个到第一个的顺序)
julie/hello/3.0,julie/hello/2.0,whitney/hello/1.0,remo/hello3/3.0,remo/hello2/2.0,remo/hello/1.0
Run Code Online (Sandbox Code Playgroud)
我试过以下代码:
tail -r parse.txt
Run Code Online (Sandbox Code Playgroud)
Mic*_*ith 26
你可以使用tacGNU Coreutils 的惊人帮助.
tac -s "," parse.txt > newparse.txt
Run Code Online (Sandbox Code Playgroud)
tac默认情况下会将文件"cat"到标准输出,反转行.通过使用-s标志指定分隔符,您可以根据需要简单地反转字段.
(您可能需要执行后处理步骤才能使逗号正常运行,这可能是您管道中的另一个步骤.)
我喜欢这个tac解决方案; 它紧凑而优雅,但正如Micah指出的那样,tac是GNU Coreutils的一部分,这意味着它在FreeBSD,OSX,Solaris等中默认不可用.
这可以在纯粹的bash中完成,无需外部工具.
#!/usr/bin/env bash
unset comma
read foo < parse.txt
bar=(${foo//,/ })
for (( count="${#bar[@]}"; --count >= 0; )); do
printf "%s%s" "$comma" "${bar[$count]}"
comma=","
done
Run Code Online (Sandbox Code Playgroud)
这显然只根据您的样本输入处理一行.如果需要处理多行输入,可以将其包装.
这里的逻辑是我们可以通过用空格替换逗号将输入转换为数组.当然,如果我们的输入数据包含空格,则必须进行调整.一旦我们有阵列,我们只需向后退一步,打印每个记录.
请注意,这不包括终止换行符.如果你想要一个,你可以添加:
printf '\n'
Run Code Online (Sandbox Code Playgroud)
作为最后一行.
perl -F, -lane 'print join ",", reverse @F' parse.txt > output.txt
Run Code Online (Sandbox Code Playgroud)
您可以使用以下 awk 命令:
awk -v RS=, '{a[++i]=$1} END{for (k=i; k>=1; k--) printf a[k] (k>1?RS:ORS)}' parse.txt
julie/hello/3.0,julie/hello/2.0,whitney/hello/1.0,remo/hello3/3.0,remo/hello2/2.0,remo/hello/1.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2130 次 |
| 最近记录: |