如何将grep多行输出按行拆分多参数传入xargs
解决CSV行拆分并多参数传递给Python脚本的问题
需求背景
有一列数不固定的CSV文件,执行以下命令筛选出目标行:
grep -v 'Coba' ETFs.csv | grep 'Sector'
得到输出:
CAPE,Ossiam Shiller Barclays Cape Europe Sector Value TR,EUPE,FWB EUPB1,Ossiam Shiller Barclays Cape Global Sector Value,EUPB,FWB
需要为每行调用Python脚本script.py,将第3列作为-t参数、第2列作为-n参数传入,即执行:
script.py -t EUPE -n "Ossiam Shiller Barclays Cape Europe Sector Value TR" script.py -t EUPB -n "Ossiam Shiller Barclays Cape Global Sector Value"
此前尝试的多参数传递方法因字段含空格、xargs处理逻辑问题失败,导致argparse触发参数错误提示。
解决方案1:用awk直接调用脚本(最简洁)
利用awk的system函数,在匹配行中直接构造并执行命令,同时用双引号包裹含空格的字段:
awk -F, '! /Coba/ && /Sector/ { system("python script.py -t " $3 " -n \"" $2 "\"") }' ETFs.csv
-F,指定逗号为字段分隔符! /Coba/ && /Sector/匹配不含Coba且包含Sector的行\"" $2 "\""给含空格的第2列加上双引号,避免bash将空格解析为参数分隔符
解决方案2:结合xargs与bash按行处理
通过xargs -L 1指定按行处理,再用bash的read命令拆分每行字段:
grep -v 'Coba' ETFs.csv | grep 'Sector' | xargs -L 1 bash -c 'IFS=, read -r _ col2 col3 _ <<< "$0"; python script.py -t "$col3" -n "$col2"'
xargs -L 1每次处理一行输入,将整行作为bash -c的$0参数IFS=, read -r _ col2 col3 _按逗号拆分行,忽略不需要的第1、4列(用_占位)"$col3""$col2"用双引号包裹参数,保留字段内的空格
解决方案3:修复原awk+xargs的方法
调整字段分隔符为制表符(避免字段内可能出现的逗号干扰),同时正确传递带空格的参数:
awk -F, '! /Coba/ && /Sector/ {printf "%s\t%s\n", $3, $2}' ETFs.csv | xargs -t -L 1 bash -c 'python script.py -t "$1" -n "$2"' _
printf "%s\t%s\n"用制表符分隔第3、2列输出xargs -L 1按行处理输入bash -c '...' _中_作为$0的占位符,$1对应第3列、$2对应第2列,双引号确保空格不被拆分
失败原因说明
此前的方法未给含空格的第2列添加双引号,导致bash将字段内的空格识别为参数分隔符,-n参数后被拆分成多个无效参数,触发argparse的参数错误提示。
内容的提问来源于stack exchange,提问作者Frumda Grayforce
相关产品推荐
相关产品推荐

