Awk 在特定列中精确匹配字符串仅返回标题行

Awk 在特定列中精确匹配字符串仅返回标题行

我有一个 6-7M 行的 CSV 文件,最终用户希望使用 Excel 或 Numbers 进行查看。每个用户只需查看文件的一个子集,因此我希望提供awk一行代码,供他们在进行上游更改之前使用。

CSV 文件如下所示:

# bot-eod-report.csv
underlying_symbol,id,executed_at,ewma_nbbo_ask,ewma_nbbo_bid
TSLA,TSLA230224C00210000,2023-02-17 20:34:16.639229+00,5.40,5.35
DKNG,DKNG230421C00035000,2023-02-17 20:34:16.616227+00,0.07,0.02
QQQ,QQQ230217C00301000,2023-02-17 20:34:16.616051+00,0.35,0.34
TQQQ,TQQQ230217P00027000,2023-02-17 20:34:16.363909+00,3.15,3.05
PLTR,PLTR230217C00009000,2023-02-17 20:34:16.331521+00,0.18,0.16
QQQJ,QQQJ230217P00027000,2023-02-17 20:34:16.313909+00,3.15,3.05

第一列underlying_symbol包含用户想要过滤的字符串值。

假设用户只想查看第 1 列的值为“QQQ”的行并保留第一行(包含列标题),则输出 CSV 应如下所示:

underlying_symbol,id,executed_at,ewma_nbbo_ask,ewma_nbbo_bid
QQQ,QQQ230217C00301000,2023-02-17 20:34:16.616051+00,0.35,0.34

我的第一次尝试是:

> awk 'NR==1; NR>1 $1~/QQQ/' bot-eod-report.csv > qqq_only.csv

但是此模式与“TQQQ”和“QQQJ”匹配,这是用户不想要的:

# qqq_only.csv
underlying_symbol,id,executed_at,ewma_nbbo_ask,ewma_nbbo_bid
QQQ,QQQ230217C00301000,2023-02-17 20:34:16.616051+00,0.35,0.34
TQQQ,TQQQ230217P00027000,2023-02-17 20:34:16.363909+00,3.15,3.05
QQQJ,QQQJ230217P00027000,2023-02-17 20:34:16.313909+00,3.15,3.05

https://stackoverflow.com/a/63061515/3075291

^--我找到了这个答案,它似乎正是我所需要的,并尝试了:

> awk 'BEGIN{FS=","} NR==1; NR>1 $1=="QQQ"' bot-eod-report.csv > qqq_only_2.csv

但这产生了零行:

# qqq_only_2.csv
underlying_symbol,id,executed_at,ewma_nbbo_ask,ewma_nbbo_bid

我正在使用 Windows 并且发现可能存在单引号/双引号问题,因此我尝试了来自同一 Stack Overflow 答案的这个变体:

> awk -v value="QQQ" 'BEGIN{FS=","} NR==1; NR>1 $1==value' bot-eod-report.csv > qqq_only_3.csv

但还是没有匹配:

# qqq_only_3.csv
underlying_symbol,id,executed_at,ewma_nbbo_ask,ewma_nbbo_bid

删除文件分隔符部分并调整周围的引号value也没有产生任何效果:

(无文件分隔符)

> awk -v value="QQQ" 'NR==1; NR>1 $1==value' bot-eod-report.csv > qqq_only_4.csv

# qqq_only_4.csv
underlying_symbol,id,executed_at,ewma_nbbo_ask,ewma_nbbo_bid

(值上使用单引号代替双引号)

> awk -v value='QQQ' 'NR==1; NR>1 $1==value' bot-eod-report.csv > qqq_only_5.csv

# qqq_only_5.csv
underlying_symbol,id,executed_at,ewma_nbbo_ask,ewma_nbbo_bid

对于 GNU Awk 版本 5.0.0,我应该使用什么来获得第一列的精确字符串匹配?

答案1

如果我理解正确的话,您希望打印第一行以及第一个字段中包含精确字符串的行。如果是这样,您可以使用以下命令:

awk -F, 'NR==1 || $1=="QQQ"' bot-eod-report.csv

如果您想要保留 shell 变量中的值并使用它,awk您可以尝试类似以下操作:

var_shell="QQQ"
awk -F, -v var=$var_shell 'NR==1 || $1=var' bot-eod-report.csv

相关内容