我有一个包含大量文本文件的目录(通常名为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 :(得分:1)
如果相同的时间相邻(即在以下行中),则只能使用uniq
。 uniq
有参数来指定从前一行开始比较的位置,以及你必须检查多少个字符(至少是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