我有这个文件:
a
b
c
d
e
f
我希望将最后一行复制到第一行之前,所以我会得到以下结果:
f
a
b
c
d
e
f
我怎样才能在sed
or中做到这一点awk
?
答案1
和ed
:
$ printf '$t0\n,p\n' | ed -s file
f
a
b
c
d
e
f
命令t
ined
将一行从指定行(此处$
为最后一行)传输/复制到由其参数指定的行之后(此处0
,即在第一行之前插入)。该,p
命令打印编辑缓冲区的内容(将其更改为w
将结果写回到文件中)。
答案2
纯的sed
:
sed 'H;1h;$!d;G' file.txt
所有行都收集在保留空间中,然后附加到最后一行:
H
将当前行追加到保留空间。不幸的是,这将以换行符开始保留空间,因此1h
对于第一行,保留空间会被该行覆盖,而不会在前面出现换行符$!d
意味着如果这不是 (!
) 最后一行 ($
),d
则删除该行,因为我们还不想打印它G
仅对最后一行执行,因为对于其他行d
已停止处理。现在,我们在保留空间中收集的所有行(从第一行到最后一行)都将使用命令附加到当前(最后一行)行,G
并且所有内容都会打印在脚本末尾。
答案3
或者只是像这样,没有 sed 或其他
tail -1 list && cat list
答案4
GNU awk:
awk 'ENDFILE { if(NR==FNR) print } NR!=FNR' infile{,}
便携式 awk:
awk 'NR!=FNR && !f { f=1; print p } NR!=FNR; { p=$0 }' infile{,}