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

时间:2019-10-06 13:54:51

标签: linux sed grep copy paste

情况

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

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. 我不知道如何将找到的内容添加到另一个文件的特定行的末尾,而不删除该行中的内容。

2 个答案:

答案 0 :(得分:0)

$ awk 'NR==FNR{a[NR]=$(NF-2) OFS $(NF-1) OFS $NF; next} {print $0, 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

答案 1 :(得分:-1)

这里是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) {
    $0=$0 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,您可以控制从哪些记录中读取最后三个字段(即,从特定行号 )以及它们的记录附加到-的顺序。