ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

传递参数到awk里面做循环

2019-11-18 12:51:34  阅读:234  来源: 互联网

标签:bash shell awk linux


我在第二栏中有大量的制表符分隔的文本文件,其中包含我感兴趣的分数:

test_score_1.txt

Title   FRED Chemgauss4 File
24937   -6.111582   A
24972   -7.644171   A
26246   -8.551361   A
21453   -7.291059   A

test_score_2.txt

Title   FRED Chemgauss4 File
14721   -7.322331   B
27280   -6.229842   B
21451   -8.407396   B
10035   -7.482369   B
10037   -7.706176   B

我想检查标题是否比我定义的数字小.

以下代码在脚本中定义了我的分数并起作用:

check_score_1

#!/bin/bash

find . -name 'test_score_*.txt' -type f -print0 |
while read -r -d $'\0' x; do
    awk '{FS = "\t" ; if ($2 < -7.5) print $0}' "$x"
done

如果我尝试将像check_scores_2.sh这样的参数传递给awk,如check_score_2.sh所示为“ -7.5”,则这将返回两个文件中的所有条目.

check_scores_2.sh

#!/bin/bash

find . -name 'test_score_*.txt' -type f -print0 |
while read -r -d $'\0' x; do
    awk '{FS = "\t" ; if ($2 < ARGV[1]) print $0}' "$x"
done

最后,check_scores_3.sh显示我实际上没有从命令行传递任何参数.

check_scores_3.sh

#!/bin/bash

find . -name 'test_score_*.txt' -type f -print0 |
while read -r -d $'\0' x; do
    awk '{print ARGV[0] "\t" ARGV[1] "\t" ARGV[2]}' "$x"
done

$./check_score_3.sh“ -7.5”给出以下输出:

awk ./test_score_1.txt  
awk ./test_score_1.txt  
awk ./test_score_1.txt  
awk ./test_score_1.txt  
awk ./test_score_1.txt  
awk ./test_score_2.txt  
awk ./test_score_2.txt  
awk ./test_score_2.txt  
awk ./test_score_2.txt  
awk ./test_score_2.txt  
awk ./test_score_2.txt  

我究竟做错了什么?

解决方法:

在您的shell脚本中,shellscript的第一个参数为$1.您可以将该值分配给awk变量,如下所示:

find . -name 'test_score_*.txt' -type f -exec awk -v a="$1" -F'\t' '$2 < a' {} +

讨论区

>您的print0 / while读取循环非常好.但是,find提供的-exec选项可以在不进行任何显式循环的情况下运行同一命令.
>可以选择将命令{if($2< -7.5)打印$0}简化为条件$2<. -7.5.这是因为条件的默认操作是print $0.
>请注意,引用$1和$2完全不相关.因为$1用双引号引起来,所以shell在awk命令开始运行之前用它代替. shell解释$1表示脚本的第一个参数.因为$2用单引号引起来,所以外壳程序将其保留下来,并由awk解释. Awk将其解释为当前记录的第二个字段.

标签:bash,shell,awk,linux
来源: https://codeday.me/bug/20191118/2028168.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有