Ubuntu 删除文本文件中定期重复出现的行组

Ubuntu 删除文本文件中定期重复出现的行组,ubuntu,awk,sed,Ubuntu,Awk,Sed,假设我有一个包含这种类型的科学数据的大文本文件 1.1 1-105.122 1.12-114.091 1.13-99.913 1.2 1-103.564 1.2 2-108.001 1.23-102.402 1.3 1-104.875 1.4.2-108.223 1.4.3-100.291 让我们将前3行组称为1.1,将下3行组称为1.2,以此类推 假设此模式重复 我想解析这个文件并删除其他所有组,这样结果包含组1.1、1.3、1.5、1.7等,并删除1.2、1.4、1.6等 我一直在浏览AW

假设我有一个包含这种类型的科学数据的大文本文件

1.1 1-105.122
1.12-114.091
1.13-99.913
1.2 1-103.564
1.2 2-108.001
1.23-102.402
1.3 1-104.875
1.4.2-108.223
1.4.3-100.291

让我们将前3行组称为1.1,将下3行组称为1.2,以此类推

假设此模式重复

我想解析这个文件并删除其他所有组,这样结果包含组1.1、1.3、1.5、1.7等,并删除1.2、1.4、1.6等

我一直在浏览AWK命令(刚刚开始学习AWK),但似乎找不到实现这一点的方法。有什么建议吗

救援人员:

perl -ane 'if ($current ne $F[0]) {
                $should_print = ! $should_print;
                $current = $F[0];
            }
            print if $should_print;
           ' input
  • -n
    逐行处理输入
  • -a
    将每一行拆分为空格上的
    @F
    数组,因此
    $F[0]
    是第一列
  • $current
    记住当前组
  • 如果要输出组,
    $should\u print
    为真

在每次组更改时,
$should\u print
在true和false之间切换,当前组将被更新。

您可以使用如下小awk脚本完成此操作:

script.awk

$1 != old  { old = $1; grp++ };
grp % 2   
awk-f script.awk文件

脚本在每一行上比较当前的
$1
旧的
值。当检测到组更改时,
old
将更改,
grp
将递增


第二行检测
grp
是偶数还是奇数。在奇数情况下,条件为真,打印行的默认操作生效。

awk
是您的朋友:

awk -v FS="." '$2%2==1' file
样本输出

1.1 1 -105.122
1.1 2 -114.091
1.1 3 -99.913
1.3 1 -104.875
肮脏的把戏

$1 != old  { old = $1; grp++ };
grp % 2   
  • 使用
    作为分隔符,字段2将包含字符串,如
    11-105
    &
    21-103
  • 执行
    $2%2
    时,忽略空格后的任何内容
  • 现在,你需要1.1,1.3,1.5等等。这意味着你在寻找小数点后的奇数。这就是我们使用
    $2%2==1所做的
    
  • 请注意,默认操作
    awk
    是打印记录。因此,如果条件为真,则只打印记录

1.3只有一行,而1.4在第2列中以2开头而不是1,这是一个拼写错误吗?是的,对不起,这是一个拼写错误