需要将文件的最后一行移动到同一文件的第二行

需要将文件的最后一行移动到同一文件的第二行

我在 Linux 中有一个文件“test”,其中包含以下数据。

aaaaaa
bbbbbb
cccccc
dddddd
eeeeee

我需要剪切该文件的最后一行并将其放在第二个位置。它必须如下所示。

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

答案1

这个问题实际上可能最容易用 来解决ed,因为它基本上是一个可编写脚本的文本编辑器,而不是流处理器。例如,使用ed,您不必将文件的所有行保存到数组中,因为它已经为您完成了这项工作。

# Create test file
~> printf "%s\n" aaaaaa bbbbbb cccccc dddddd eeeeee >test.txt
~> cat test.txt
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee

# Use ed to open the file, move the last line after the first, save, and quit
~> printf "%s\n" '$m1' wq | ed test.txt
35
35
~> cat test.txt
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

答案2

保持缓冲方法:

sed '$x;1!H;1p;$!d;x;s/\n//
' <<\IN
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN

...这将H旧每一行不是!第一行,并且是它p打印的第一行。在$最后一行,它x改变保持和模式空间它执行H旧操作 - 将保存的行附加到最后一行 - 然后d从输出中删除所有不是!最后一行的行$

$最后一行,它x再次更改空格,s///替换掉第一个\newline 字符 - 这会处理第 2 行添加的额外内容 - 然后自动打印批次。

输出:

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

不使用保持缓冲区:

cat <<\IN >infile
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN

...只是将您的示例保存到实际文件中...

sed '1p;$!d;r infile' <infile | sed '3d;$d'

这会重定向<infile到第一个sed's stdin,它仅p打印第一行,然后d从输出中删除所有非!最后一行$。最后一行是自动打印的,但它也是执行最终命令的唯一行 - 即r读出整个infile 再次stdout。所有这些都通过|管道传递到第二个管道sed,然后只需d从其输出中删除第三个也是最后一个输入行即可完成重新排列。

输出:

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

答案3

使用 awk 的简单方法:

~$ awk '{a[NR]=$0}END{print a[1];print a[NR];for(i=2;i<NR;i++){print a[i]}}' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

您将每一行存储在a数组中,然后按照您想要的顺序打印数组(第一行、最后一行 ( NR) 以及从 2 到倒数第二行。

使用 head/tail 和 sed 的组合:

~$ head -1 f;tail -1 f;sed '1d;$d' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

打印第一行和最后一行,然后用 sed 删除第一行和最后一行。


仅使用 sed,我只能找到这个命令。我确信有更好的方法:

~$ sed '${p;x;s/^\n//;p};2,${H;d}' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

如果是第一行,则打印它(默认)。
从第二行开始,将其放入保持缓冲区( H),并从模式空间( d) 中删除。如果是最后一行,则打印它 ( p),然后获取保持缓冲区 ( x),删除空行 ( s/^\n//) 并打印它 ( p)。

答案4

使用perl:

perl -e 'my @lines = <>; print for @lines[0, $#lines, 1..$#lines-1]' file

使用 awk :

$ awk '
    {lines[NR]=$0}
    END{
        print lines[1], lines[NR];
        for (i=2; i<NR; i++) {print lines[i]}
    }
' OFS=$'\n' file

输出

aaaaaa
eeeeee
bbbbbb
cccccc
dddddd

相关内容