【发布时间】:2014-11-10 20:12:46
【问题描述】:
我需要移动文本文件的最后 4 行并将它们移动到文本文件的第二行。
我假设使用了 tail 和 sed,但是到目前为止我运气不佳。
【问题讨论】:
-
请展示你的努力;输入和输出的示例也会有所帮助。
我需要移动文本文件的最后 4 行并将它们移动到文本文件的第二行。
我假设使用了 tail 和 sed,但是到目前为止我运气不佳。
【问题讨论】:
这是head 和tail 解决方案。让我们从与 Glenn Jackman 相同的示例文件开始:
$ seq 10 >file
应用这些命令:
$ head -n1 file ; tail -n4 file; tail -n+2 file | head -n-4
1
7
8
9
10
2
3
4
5
6
解释:
head -n1 file
打印第一行
tail -n4 file
打印最后四行
tail -n+2 file | head -n-4
打印从第 2 行开始到倒数第四行之前的行。
【讨论】:
如果我猜对了,ed 可以处理你的任务:
seq 10 > file
ed file <<'COMMANDS'
$-3,$m1
w
q
COMMANDS
cat file
1
7
8
9
10
2
3
4
5
6
第 7、8、9、10 行已移至第 2 行
$-3,$m1 表示,对于从“$-3”(最后一行前 3 行)到“$”(最后一行,将它们(“m”)移到第一行(“1 ")
请注意,heredoc 已被引用,因此 shell 不会尝试将字符串 $- 和 $m1 解释为变量
如果您不想实际修改文件,而是打印到标准输出:
ed -s file <<'COMMANDS'
$-3,$m1
%p
Q
COMMANDS
【讨论】:
这是一个awk 解决方案:
seq 10 > file
awk '{a[NR]=$0} END {for (i=1;i<=NR-4;i++) if (i==2) {for (j=NR-3;j<=NR;j++) print a[j];print a[i]} else print a[i]}' file
1
7
8
9
10
2
3
4
5
6
【讨论】: