从文件中删除特定行

时间:2013-03-05 17:15:37

标签: bash shell awk unique

我有一个包含大量文本文件的目录(通常名为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的新手,所以任何指针都会感激不尽!

4 个答案:

答案 0 :(得分:1)

如果相同的时间相邻(即在以下行中),则只能使用uniquniq有参数来指定从前一行开始比较的位置,以及你必须检查多少个字符(至少是GNU一个)。在这种情况下,似乎数字以固定字符开头和结尾,您可以写出类似的内容:

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

outfile将在此字符集中保留不同的行。

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

答案 1 :(得分:1)

试试这个单行:

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

答案 2 :(得分: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相邻。

答案 3 :(得分:0)

你可以尝试的另一个:

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