![在 awk 命令中使用变量](https://linux22.com/image/186116/%E5%9C%A8%20awk%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%8F%98%E9%87%8F.png)
我试图
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
在这里,我们正在读取所有字符串(在空格或\n
ewline上分割)[[:space:]]
“字符串.txt”文件放入awk
关联的数组中(我们将其命名为strings
)。
控制ATGIND==2
输入并仅运行代码的第一块“字符串.txt”文件和awk将跳过运行该块以获取下一个输入。看这里为什么我们更喜欢这个而不是更常见的使用NR==FNR
。
当下一个文件时“标准.txt”打开进行处理,我们将记录分隔符设置为默认的\n
ewline 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