2013-03-05 162 views
1

我有一个包含大量文本文件(通常名为rt ??????。MON)的目录。每个文件都包含在格式从文件中删除特定的行

#  HEADER INFO 
#  ... 
# 
# --- TIME SERIES --- 
#  TIME  Var1  Var 2  ... 
#  [s]  [kg]  [kg]  ... 
#   1  2  3  ... 
    0.0000E+00 1.0000E+00 1.0000E+00 ... 
    6.4619E+00 2.0000E+00 2.0000E+00 ... 
    6.4619E+00 2.5000E+00 2.5000E+00 ... 
    8.9690E+00 3.0000E+00 3.0000E+00 ... 
    ... 

我试图写一个bash脚本,将读下来每个文件并删除重复的时间线(这是由四舍五入造成的)结果。因此,对于上面的例子,输出将是

#  HEADER INFO 
#  ... 
# 
# --- TIME SERIES --- 
#  TIME  Var1  Var 2  ... 
#  [s]  [kg]  [kg]  ... 
#   1  2  3  ... 
    0.0000E+00 1.0000E+00 1.0000E+00 ... 
    6.4619E+00 2.0000E+00 2.0000E+00 ... 
    8.9690E+00 3.0000E+00 3.0000E+00 ... 

位BASH新手位,所以任何指针将受到感谢!

+0

什么是文件分隔符?标签? – squiguy 2013-03-05 17:24:58

+0

文件空间不足。 – 2013-03-05 17:41:16

回答

1

尝试这一个班轮:

awk '$1!~/^#/&&$1 in a{next;}{a[$1]}1' file 
+0

谢谢。这一个为我工作。尽管我还没有机会测试其他可能如此好的解决方案。我可以看到我将不得不花费一些时间来学习awk。 – 2013-03-10 18:16:42

1

如果相同的时间是相邻的(即在下面的行中),那么您只能使用uniquniq有参数来指定从哪里开始与前一行比较,以及您必须检查多少个字符(至少是GNU的一个字符)。在这种情况下,因为它似乎,这些数字开始和结束在一个固定的字符,你可以写类似:

uniq --skip-chars=2 --check-chars=10 infile > outfile 

outfile将举行不同的线路,因为这组字符。

作为sudo_O注释,此解决方案可能会干扰文件的标题部分。我通常比较喜欢仅仅使用这些数据来创建文件,然后添加标题,或者在使用grep或其他工具来获取数据行之前过滤文件,然后添加标题部分。

+0

我几乎喜欢这个答案..但是,OP没有说明重复项是相邻的,这可以删除标题部分中的行,例如,OP从输入中省略了行。 – 2013-03-05 18:00:34

+0

嗯......你对标题部分是正确的。这就是为什么它应该通过某种过滤(grep?)进行处理,并添加后者,以实现均匀性和易于处理。此外,由于数字指定的时间(按照OP问题),并且按照递增顺序,所以我认为你可以假设它们是相邻的。 – 2013-03-05 18:04:08

0

AWK是为这个完美的:

$ awk '$1~/^[0-9].[0-9]{4}E[+-][0-9]{2}$/{if(!a[$1]++)print;next}1' file 
#  HEADER INFO 
#  ... 
# 
# --- TIME SERIES --- 
#  TIME  Var1  Var 2  ... 
#  [s]  [kg]  [kg]  ... 
#   1  2  3  ... 
    0.0000E+00 1.0000E+00 1.0000E+00 ... 
    6.4619E+00 2.0000E+00 2.0000E+00 ... 
    8.9690E+00 3.0000E+00 3.0000E+00 ... 
    ... 

使用这样一个严格的正则表达式比较将确保只有你想将要删除的重复和awk优点是重复的时间不会是相邻的像uniq一样。

0

另外一个你可以尝试:

awk '/^#/ || !A[$1]++' file