剪切行的特定部分并粘贴到另一个文件的特定部分

Cut specific part of line and paste into specific part of another file

情况

我有一个大文件,我需要从特定的行号中剪切一部分字符串(最后三个值)。我必须将剪切线片段粘贴到另一个文件中另一行的末尾。大文件中的行看起来有点像这样:

33 X2_C(4)     0.2454  1.1280  0.0073      1.4926102  15.5148009   0.0724955
34 X2_C(5)     0.2487  1.2156 -0.0585      1.5876791  16.7196951  -0.5831547
35 X2_C(6)     0.2529  1.2191 -0.1998      1.7741292  16.7675608  -1.9922789

现在我发现要获得最后三个数字,正则表达式应该如下所示:

\-{0,1}\d[0-9]{0,2}\.\d[0-9]{4,6}\s+\-{0,1}\d[0-9]{0,2}\.\d[0-9]{4,6}\s+\-{0,1}\d[0-9]{0,2}\.\d[0-9]{4,6}

要修改的文件如下所示:

C(Fragment=1)
C(Fragment=2)
C(Fragment=2)

预期输出

C(Fragment=1)   1.4926102  15.5148009   0.0724955
C(Fragment=2)   1.5876791  16.7196951  -0.5831547
C(Fragment=2)   1.7741292  16.7675608  -1.9922789

问题

  1. 我不知道如何告诉 grep 仅从一个特定行获取匹配模式。
  2. 我不知道如何将找到的内容追加到另一个文件中特定行的末尾而不删除该行中的内容。

这是 awk 的一个,首先是我使用的测试文件:

$ cat file1
111 112 113 114
121 122 123 124
131 132 133 134
141 142 143 144
151 152 153 154
$ cat file2
211
221
231
241

awk:

$ cat program.awk
BEGIN {
    n=split(from,from2,",")
    m=split(to,to2,",")
    if(n!=m)
        exit
    for(i in from2) {
        from3[from2[i]]=i
        to3[to2[i]]=i
    }
}
NR==FNR {
    if(FNR in from3) 
        from2[from3[FNR]]=$(NF-2) OFS $(NF-1) OFS $NF
    next
}
(FNR in to3) {
    [=11=]=[=11=] OFS from2[to3[FNR]]
}1

使用它:

$ awk -v from="2,3,4" -v to="1,4,3" -f progran.awk file1 file2
211 122 123 124
221
231 142 143 144
241 132 133 134

使用参数 fromto 您可以控制从哪些记录读取最后三个字段(即 从特定行号 )以及它们附加到哪些记录 - 以及顺序。

$ awk 'NR==FNR{a[NR]=$(NF-2) OFS $(NF-1) OFS $NF; next} {print [=10=], a[FNR]}' file1 file2
C(Fragment=1) 1.4926102 15.5148009 0.0724955
C(Fragment=2) 1.5876791 16.7196951 -0.5831547
C(Fragment=2) 1.7741292 16.7675608 -1.9922789