在Unix shell中反转一个文件

Rcz*_*one 12 unix bash shell

我有一个文件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标志指定分隔符,您可以根据需要简单地反转字段.

(您可能需要执行后处理步骤才能使逗号正常运行,这可能是您管道中的另一个步骤.)

  • 请注意,如果有换行符,换行符将成为最后一个字段的一部分 (5认同)
  • `rev`不适用于这个特殊问题.`printf"%s \n"abc def ghi | tac`与`printf"%s \n"abc def ghi | rev` (2认同)

gho*_*oti 9

我喜欢这个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)

作为最后一行.


gle*_*man 7

perl -F, -lane 'print join ",", reverse @F' parse.txt > output.txt
Run Code Online (Sandbox Code Playgroud)


anu*_*ava 4

您可以使用以下 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)