在结构模拟期间,我在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
任何人都可以通过awk
,sed
和cat
来指导我吗?我也可以使用管道>>
。
答案 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行开始输出。