在 awk 命令中使用变量

在 awk 命令中使用变量

我试图

for ds in $(cat Nikhil/strings.txt )
do
awk -v k="$ds" '{if (substr($0,2,5) == k )print $0}' criteria5.txt
done

但是当我执行此操作时,它将 k 的值作为 k 而不是变量。 Shell check .net 无法正常工作,因此必须将其发布到此处

+ for ds in '$(cat Nikhil/strings.txt )'

+ awk -v k=CDA01 '{if (substr($0,2,5) == k )print $0}' criteria5.txt

这就是我尝试使用 sh -x 进行调试时的输出。有什么建议请

答案1

我无法重现您的代码中发生的情况,但我发现一切在语法上都很好并且可以工作;但这是您似乎正在尝试对 shell 循环执行的操作,您最好这样做热衷于它。下面我awk单独使用命令。

gawk 'ARGIND==2{ strings[$0]; next; };
     (substr($0, 2, 5) in strings);
' RS='[[:space:]]+' strings.txt RS='\n' criteria.txt

在这里,我们正在读取所有字符串(在空格或\newline上分割)[[:space:]]“字符串.txt”文件放入awk关联的数组中(我们将其命名为strings)。

控制ATGIND==2输入​​并仅运行代码的第一块“字符串.txt”文件和awk将跳过运行该块以获取下一个输入。看这里为什么我们更喜欢这个而不是更常见的使用NR==FNR

当下一个文件时“标准.txt”打开进行处理,我们将记录分隔符设置为默认的\newline RS='\n';我们(substr($0, 2, 5) in strings)正在检查是否符合预期substr从位置开始2字符长度为5是否存在于我们的数组中,如果存在,则该行将转到输出。

输入数据: strings.txt

CDA01 CDA02
   CDA03
CDA03    CDA05 CDA06

criteria.txt:

xCDA01 something
xxCDA02 someotherthing
CDA01
vcCDA03 oCDA03
vCDA05 end

输出:

xCDA01 something
vCDA05 end

相关内容