在Unix中将一行文件从linenumber`n1`移动到linenumber`n2`

时间:2016-05-10 13:08:16

标签: bash file shell unix sed

我有一个名为file1的文件,如下所示。

  1 intst
  2 1.0
  3 12.591870 0.000000 0.000000
  4 0.000000 12.591870 0.000000
  5 0.000000 0.000000 12.591870
  6 Ba Zr Al O
  7 27 26 1 81
  8 direct
  9 0.166667 0.166666 0.167762 Ba
 10 0.166667 0.166667 0.500000 Ba  #Line to be moved
 11 0.166666 0.166667 0.832238 Ba
 ...
 ...
 60 0.666668 0.666666 0.329117 Zr
 61 0.666665 0.666667 0.670884 Zr
 62 0.666667 0.666667 1.000000 Al #Moved line to be inserted below this line
 63 0.166667 0.999071 0.999999 O

我需要复制line- 10的内容并通过创建新行将其移至line-62以下,以便新的文件内容显示为

  1 intst
  2 1.0
  3 12.591870 0.000000 0.000000
  4 0.000000 12.591870 0.000000
  5 0.000000 0.000000 12.591870
  6 Ba Zr Al O
  7 27 26 1 81
  8 direct
  9 0.166667 0.166666 0.167762 Ba
 10 0.166666 0.166667 0.832238 Ba #Original line- 11
 ...
 ...
 59 0.666668 0.666666 0.329117 Zr
 60 0.666665 0.666667 0.670884 Zr
 61 0.666667 0.666667 1.000000 Al
 62 0.166667 0.166667 0.500000 Ba #Original line-10
 63 0.166667 0.999071 0.999999 O

使用sed我分别知道如何删除一行

sed -i.bkp -e '10d' file

并插入一行

sed -i '10i <string>'file1

但我不确定如何复制一行的内容并将其移至另一行

2 个答案:

答案 0 :(得分:3)

您可以使用此sed

sed '10{h;D}; 62G' file

根据@Benjamin的评论,您也可以使用d

sed '10{h;d}; 62G' file

使用-i.bak进行就地编辑。

下面,

  • 10 and 62 - 行号
  • h - 复制模式空间以容纳空间。这样可以节省line 10以保留空间。
  • G - 为模式空间添加保留空间。这会将line 10附加到模式空间。
  • D - 删除模式空间中的文本,直至第一个换行符。

答案 1 :(得分:2)

AWK:

awk -v n1=10 -v n2=62 '
    NR == n1 {line=$0; next}
    {print}
    NR == n2 {print line}
' file > file.new

或古老的ed(就地编辑文件)

ed file <<END_ED
# move line 10 after line 62
10m62
# save and quit
w
q
END_ED