我运行./command script.sh 11
的脚本,下面的代码的第一行将输出(321)成功地存储在参数x中(在第2行中使用echo检查)。在第3行,我尝试使用参数x检索第一列中的值等于x(在doc2.csv中)的所有行上的最后两列。这将无法正常工作,但是当我用z=321
替换z=$x
时,它工作正常。为什么传递参数时这个代码不工作?在awk命令中传递一个参数将不起作用
#!/bin/bash
x="$(awk -v y=$1 -F\; '$1 == y' ~/Documents/doc1.csv | cut -d ';' -f2)"
echo $x
awk -v z=$x -F, '$1 == z' ~/Documents/doc2.csv | cut -d ',' -f2,3
doc1.csv(所有列具有唯一值)
33;987
22;654
11;321
...
doc2.csv
321,156843,ABCD
321,637253,HYEB
123,256843,BHJN
412,486522,HDBC
412,257843,BHJN
862,256843,BHLN
...
你为什么使用'cut'?在'awk'中输出你想要的列:''$ 1 == y {print $ 2}''。 – chepner
您的任一个CSV文件是否使用DOS行尾? – chepner
你在第一个文件的每行末尾几乎肯定会有一些空格,所以'x'不是'321'它的'321',而@chepner说这很可能是control-Ms,所以运行dos2unix或者首先在文件上类似。另外,当你使用awk时,你永远不需要cut,grep或sed或其他任何小工具。阅读由Arnold Robbins撰写的有效Awk编程,第4版。 –