答案1
和awk
:
$ for param in $(awk '$1 > 20 { print $3 }' inputfile); do ./process.sh "$param"; done
答案2
您并不是真的想在 shell 本身中解析数据,而是想使用类似的工具awk
来为您解析数据。
awk -F '[[:blank:]|]+' '$1 > 20 { print $2 }' file
这指示awk
将文件的每一行视为由任意数量的管道符号或空格(空格或制表符)分隔的一组字段。当第一个字段大于20时,打印第二个字段。
有关的:
如果第二列包含空格,那么您可能需要使用[[:blank:]]*[|][[:blank:]]*
作为分隔符:
awk -F '[[:blank:]]*[|][[:blank:]]*' '$1 > 20 { print $2 }' file
匹配[|]
文字管道符号,并且可以替换为\\|
(如果您喜欢反斜杠)。
以下命令使用第一列大于 20 的第二列的每个实例作为命令行参数来执行脚本:
awk -F '[[:blank:]]*[|][[:blank:]]*' '$1 > 20 { print $2 }' file |
xargs -I XX ./script.sh XX
使用类似-P 4
作为选项xargs
,您可以同时运行脚本的多个并行实例(使用 则为四个-P 4
)。
答案3
awk -F'|' '$1 > 20 { system("/path/to/another/script.sh "$2 }' < file.text
这告诉 awk 根据管道符号将输入拆分为字段。任何值大于 20 的第一个字段都会触发系统调用...任何您想要的内容。请记住,参数(此处为 $2,但也可以是 $0 或您在 awk 中执行的任何其他计算)通过 shell 调用传递给脚本,因此如果这些值可以包含 shell 特殊字符,请小心引用它。我会参考斯特凡的答案之一有关如何执行此操作的示例:
awk 'function escape(s) {
gsub(/'\''/,"&\\\\&&",s)
return "'\''" s "'\''"
}
{ system("/path/to/another/script.sh" escape($2)) }'
答案4
你也可以尝试使用 gnu sed
sed -E 's/([0-9]*) \| (.*)/[ \1 -gt 20 ] \&\& echo do something with \2/e' infile