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 的新手,因此将不胜感激地收到任何指点!

4

4 回答 4

1

如果相同的时间是相邻的(即在以下几行中),您可以只使用uniq. uniq有参数来指定从哪里开始与前一行进行比较,以及您必须检查多少个字符(至少是 GNU 一个)。在这种情况下,数字以固定字符开始和结束,您可以编写如下内容:

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

outfile从这组字符开始,将包含不同的行。

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

于 2013-03-05T17:42:33.293 回答
1

试试这个单行:

awk '$1!~/^#/&&$1 in a{next;}{a[$1]}1' file 
于 2013-03-05T17:53:56.400 回答
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并且重复时间不必像 with 那样相邻uniq

于 2013-03-05T17:43:39.113 回答
0

您可以尝试另一个:

awk '/^#/ || !A[$1]++' file
于 2013-03-05T19:52:05.717 回答