【发布时间】:2016-11-10 16:01:20
【问题描述】:
我使用./command script.sh 11 运行下面的脚本,下面的第一行代码成功地将输出(321)存储在参数 x 中(使用第 2 行的 echo 检查)。在第 3 行,我尝试使用参数 x 来检索所有行的最后两列,其中第一列中的值等于 x(在 doc2.csv 中)。这行不通,但是当我将z=$x 替换为z=321 时,它可以正常工作。为什么传递参数时这段代码不起作用?
#!/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 }'。 -
您的 CSV 文件是否使用 DOS 行尾?
-
您几乎可以肯定在第一个文件的每一行末尾都有某种空白,所以
x不是321它的321<white space>并且正如@chepner 所说,这很可能是控制-Ms 所以首先在文件上运行 dos2unix 或类似的。此外,当您使用 awk 时,您永远不需要 cut 或 grep 或 sed 或任何其他小工具。阅读 Arnold Robbins 所著的 Effective Awk 编程,第 4 版。 -
问题确实是由dos行尾引起的