循环遍历包含两列的文件

循环遍历包含两列的文件

我的问题基本上是一个后续问题这个话题。我有一个这样的文件:

1000 | line1
100  | line2
10   | line3

如果 1 美元大于 20,我想对 2 美元做一些事情。我写了一些东西来模仿第二个答案但它不起作用:

for a, b in $(cat file.text|cut -d"|" -f 1,2);
do
if ($1>20) echo $2
done;

我怎样才能实现这个目标?谢谢!

答案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

相关内容