查找文件的行模式,打印行直到第一个空行

时间:2019-10-24 14:38:03

标签: observer-pattern empty-list

我有一个带有数据标题的文件,还有另一个有关所有标题的信息。因此,我首先需要一行一行地读取标题文件,然后在另一文件中查找该行,如果找到了模式,则复制该行和下一行,直到新文件中的第一行为空。

我一直在尝试:

#!/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 :(得分:0)

欢迎来到。

首先,在图案的开头添加一个/

第二,您将在每次迭代中覆盖输出。
在循环结束时进行I / O控制:

$: 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

答案 1 :(得分:0)

自从我写下问题以来,我意识到我错过了/。 但是,钢铁不起作用!!我以为可能是空格,但是我已经解决了这个问题,但仍然无法正常工作...

这是我的真实情况:

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

这有效!