我有一个 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