如何将子文件中的文本附加到单个母文件并从子文件中删除标头

时间:2014-11-21 16:31:35

标签: linux awk sed cat piping

在结构模拟期间,我在file.txt中得到以下回复:

constant                                             
        date 03/23/2011

{BEGIN LEGEND}
 Entity #        Title
    1     blank                                                          
    2     die                                                            
    3     blank                                                         
{END LEGEND}

 slave           1 time 1.12999E+01  x  4.81992E-03  y  1.69202E+01  z  1.94541E+01  
 master          1 time 1.12999E+01  x -4.81991E-03  y -1.69202E+01  z -1.94541E+01   
 ....
 .....
 master          1 time 1.12999E+01  x -4.81991E-03  y -1.69202E+01  z -1.94541E+01


 .... are the thousands of lines

我像file1.txt file2一样每秒获取此文件1次。 txt等...

我必须加入所有文件才能生成单个文件,这样如果我复制此文件中的下一个文件,我就不会得到下面给出的文件中的任何文本,但是要附加剩下的文本最后

 constant                                             
        date 03/23/2011

{BEGIN LEGEND}
 Entity #        Title
    1     blank                                                          
    2     die                                                            
    3     blank                                                         
{END LEGEND}

上述文本需要从即将发布的文件中删除,仅保留在第一个文件中。

我应该得到:

 slave           1 time 1.12999E+01  x  4.81992E-03  y  1.69202E+01  z  1.94541E+01  
 master          1 time 1.12999E+01  x -4.81991E-03  y -1.69202E+01  z -1.94541E+01 
 slave           1 time 1.12999E+01  x  4.81992E-03  y  1.69202E+01  z  1.94541E+01  
 master          1 time 1.12999E+01  x -4.81991E-03  y -1.69202E+01  z -1.94541E+01 
 slave           1 time 1.12999E+01  x  4.81992E-03  y  1.69202E+01  z  1.94541E+01  
 master          1 time 1.12999E+01  x -4.81991E-03  y -1.69202E+01  z -1.94541E+01 
 slave           1 time 1.12999E+01  x  4.81992E-03  y  1.69202E+01  z  1.94541E+01  
 master          1 time 1.12999E+01  x -4.81991E-03  y -1.69202E+01  z -1.94541E+01 
 slave           1 time 1.12999E+01  x  4.81992E-03  y  1.69202E+01  z  1.94541E+01  
 master          1 time 1.12999E+01  x -4.81991E-03  y -1.69202E+01  z -1.94541E+01 

任何人都可以通过awksedcat来指导我吗?我也可以使用管道>>

2 个答案:

答案 0 :(得分:0)

显然,您希望从一行开始的那一刻开始打印slave

因此,您可以说:

awk '$1=="slave" {f=1} f' f1

这样就完成了。它使用标记f,当它找到一行slave作为第一个单词时激活。从那一刻开始,条件f将评估为True,以便awk执行默认操作:print

如果您碰巧包含同一目录中的所有文件,只需循环遍历它们并相应地输出:

for files in /your/path/*
do
    awk '$1=="slave" {f=1} f' "$file" >> new_file
done

目前尚不清楚第一个好的" line也可能以master开头。如果是这样,awk表达式应该是:

awk '$1=="slave" || $1=="master" {f=1} f' file

答案 1 :(得分:0)

如果标题在文件中是不变的,那么标题的行数也是如此。因此,实现这一目标的最快(也许是最脏的)方法是tail命令:

head -n 10 file1.txt > outputFile
fileCount=$(echo file*.txt | wc -w)
for ((i = 1 ; i <= $fileCount ; i++)) ; do
    tail -n +11 file$i.txt >> outputFile
done

wc -w生成glob表达式file*.txt导致的单词数,i。即输入文件的计数。参数-n +11告诉tail在每个文件的第11行开始输出。