Ubuntu 删除文本文件中定期重复出现的行组
假设我有一个包含这种类型的科学数据的大文本文件 1.1 1-105.122Ubuntu 删除文本文件中定期重复出现的行组,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.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,这是一个拼写错误吗?是的,对不起,这是一个拼写错误