Вырезать определенную часть строки и вставить в определенную часть другого файла - PullRequest
0 голосов
/ 06 октября 2019

Ситуация

У меня большой файл, и мне нужно вырезать часть строки (последние три значения) из определенных номеров строк. Я должен вставить фрагмент строки разреза в конце другой строки в другом файле. Строки в больших файлах выглядят примерно так:

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 голосов
/ 06 октября 2019
$ 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
0 голосов
/ 06 октября 2019

Вот один для 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

The 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

Спараметры from и to позволяют контролировать, из каких записей считываются последние три поля (т. е. из определенных номеров строк ) и к каким записям они прикреплены - и в каком порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...