我有一个名为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
但我不确定如何复制一行的内容并将其移至另一行
答案 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