Поиск шаблона строк файла, печать строк до первой пустой строки - PullRequest
0 голосов
/ 24 октября 2019

У меня есть файл с заголовками данных и другой файл с дополнительной информацией для всех этих заголовков. Итак, мне нужно сначала прочитать строку за строкой файла заголовка, а затем найти эту строку в другом файле, а если шаблон найден, скопировать эти строки и следующие строки до первой пустой строки в новом файле.

Я пробовал это:

#!/bin/bash
fname1= header.txt
fname2= complete-data.txt
cat $fname1 | while read -r line; do
    echo $line
    sed -n "$line/,/^ *$/p" $fname2 > new-file.txt
done

, но это не работает:

sed: can't read line/,/^ *$/p: No such file or directory

, когда я копирую строку и делаю это вручную, она работает:

sed -n 'line_to_find/,/^ *$/p2' complete-data.txt > new-file.txt

Помощь

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

С тех пор как я написал вопрос, я понял, что мне не хватает /. Но разве сталь не работает !! Я думал, что это могут быть пробелы, но я уже исправил эту проблему, и она все еще не работает ...

Это мой реальный случай:

header.txt

2019  11 16 46   6.4183 -29.23337  -71.06854   5.0000 NOEVID          0.116     5.612   4.0   5.0  20.0  21.0   9   7  16

complete-data.txt

2019  11  2 48  45.5745 -29.14132  -71.05508  54.6150 NOEVID          0.215     5.799   8.0  12.0  19.0  23.9   6   6  12
 - CP50  2019  11  2 48  57.169 P           0.601      0.588 
 - CP50  2019  11  2 49   5.164 S           1.472      0.354 
 - CP51  2019  11  2 48  55.744 P           0.254     -0.044 
 - CP51  2019  11  2 49   3.199 S           0.910     -0.250

2019  11 16 46   6.4183 -29.23337  -71.06854   5.0000 NOEVID          0.116     5.612   4.0   5.0  20.0  21.0   9   7  16
 - CP50  2019  11 16 46  16.120 P           0.351      0.097  
 - CP51  2019  11 16 46  15.205 P           0.247     -0.099  
 - CP52  2019  11 16 46  16.950 P           0.382      0.104

2019  12  0 45  30.5744 -29.01455  -71.32178  37.2900 NOEVID          0.093     6.448   7.0   5.0  12.0  14.8  10  10  20
 - C59B  2019  12  0 45  58.219XS           4.500      0.098 
 - CP02  2019  12  0 45  54.504*P           0.691      2.203 
 - CP02  2019  12  0 46   7.929 S           1.412     -0.563

Мой сценарий:

input="header.txt"
while IFS= read line 
do
   j=$(printf "%s\n" "$line")
   echo "$j"
   sed -n "/$j/,/^ *$/p" complete-data.txt >> new-file.txt
done < "$input"

Когда язапустите этот скрипт, new-file.txt пуст. Я попытался изменить последнюю строку:

done < "$input" > new-file.txt

, но выходной файл все еще пуст

НО! если я запускаю его вручную:

sed -n "/2019  11 16 46   6.4183 -29.23337  -71.06854   5.0000 NOEVID          0.116     5.612   4.0   5.0  20.0  21.0   9   7  16/,/^ *$/p" complete-data.txt >> new-file.txt

Это работает !!

0 голосов
/ 24 октября 2019

Добро пожаловать в SO.

Во-первых, добавьте / в начале вашего паттерна.

Во-вторых, вы перезаписываете свои выходные данные на каждой итерации.
Делайте свое IУправление выводом в конце цикла:

$: cat header.txt
2    
4

$: cat complete-data.txt
1
this is #1
just #1

2
this is #2
just #2

3
this is #3
just #3

4
this is #4
just #4

5
this is #5
just #5

$: while read -r line
   do sed -n "/$line/,/^ *$/p" complete-data.txt
   done < header.txt > new-file.txt

$: cat new-file.txt
2
this is #2
just #2

4
this is #4
just #4
...