使用 sed 或 awk 复制行并将其插入到新位置

使用 sed 或 awk 复制行并将其插入到新位置

我有这个文件:

a
b
c
d
e
f

我希望将最后一行复制到第一行之前,所以我会得到以下结果:

f
a
b
c
d
e
f

我怎样才能在sedor中做到这一点awk

答案1

ed

$ printf '$t0\n,p\n' | ed -s file
f
a
b
c
d
e
f

命令tined将一行从指定行(此处$为最后一行)传输/复制到由其参数指定的行之后(此处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{,}

相关内容