gpt4 book ai didi

database - awk - 仅打印第一行重复项及其下面的行

转载 作者:太空宇宙 更新时间:2023-11-04 04:15:35 24 4
gpt4 key购买 nike

我有一个大型数据库文件需要一些操作。本质上,我需要避免由“|”分隔的重复字段用于:

-- TITLE1 | TITLE2   |T3   |TITLE4|TITLE5 
----------|----------|-----|------|---------------
--
DATA1 | SAME | | | blah blah
ELIGIBLE | x1
DATA1 | SAME | | blah | blah
ELIGIBLE | x2
DATA1 | SAME | | blah | blah blah
ELIGIBLE | x2
DATA2 | SAME | | | blah blah
ELIGIBLE | y1
DATA2 | SAME | | blah | blah
ELIGIBLE | y2
DATA2 | SAME | | blah | blah blah blah blah
ELIGIBLE | y2
DATA3 | SAME | | | blah blah
ELIGIBLE | z1
DATA3 | SAME | | blah | blah
ELIGIBLE | z2
DATA3 | SAME | | blah | blah blah blah blah
ELIGIBLE | z2

我使用的代码是

BEGIN{ FS = "|" }
{
count[$1]++;
if (count[$1] == 1)
first [$1] = $0;
if (count[$1] > 1)
print first[$1]
NR==1;
}

但它给了我输出:

-- TITLE1 | TITLE2   |T3   |TITLE4|TITLE5 
----------|----------|-----|------|---------------
--
DATA1 | SAME | | | blah blah
ELIGIBLE | x1
DATA2 | SAME | | | blah blah
DATA3 | SAME | | | blah blah

我更喜欢这样的输出:

-- TITLE1 | TITLE2   |T3   |TITLE4|TITLE5 
----------|----------|-----|------|---------------
--
DATA1 | SAME | | | blah blah
ELIGIBLE | x1
DATA2 | SAME | | | blah blah
ELIGIBLE | y1
DATA3 | SAME | | | blah blah
ELIGIBLE | z1

我并不真正关心标题栏,但需要它来显示概述的数据。对于业余的解释感到抱歉,但任何对解决方案的帮助将不胜感激。我是 Linux 命令行脚本方面的新手,所以如果有人也能解释为什么我的答案是错误的,我将不胜感激。我不限于awk,可以使用任何命令解决方案。我只是想尝试使用 awk 的解决方案。

最佳答案

你可以试试这个:

awk -F\| '(printed!=0 && /ELIGIBLE/) {print; printed=0;} (!seen[$1] && $1 !~ /ELIGIBLE/) { print; printed = 1; seen[$1] = 1;  }' 

尽管几乎肯定有更好的方法。

预计到达时间:有一个很好的 Awk 教程 here以及网络上的其他一些内容,以及一些好书。但基本上,awk 程序是一系列模式和代码块,在与该模式匹配的每个记录(默认情况下为行)上运行。

awk '/foo/          { do this for lines that contain "foo" anywhere }
($1 == "bar") { do this for lines whose first field is exactly "bar' }
($NF ~ /baz/) { do this for lines whose last field contains "baz" }
(NF == 1) { do this for lines with exactly one field }
(NR == 10) { do this only on the 10th line }'

如果没有模式,该 block 将在每一行上运行。

awk '{print $NF}'   # print the last field of every line

如果没有 block 而只有一个模式,则匹配的行将按原样打印:

awk '/foo/'      # same as grep foo

在处理任何输入之前运行标记为 BEGIN 的 block ;处理完所有输入后运行标记为 END 的 block 。

awk 'BEGIN { t = 0 } {t += $NF} END { print t }'   # print total of last column 

但实际上未初始化的变量在算术中被视为0,因此您可以跳过初始化:

awk '{t += $NF} END {print t}'

某些版本的 awk 需要分号 ; 或模式/ block 对之间的换行符

关于database - awk - 仅打印第一行重复项及其下面的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16546821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com