我有一个 csv 文件,我需要将第二行第四列中的值与字符串进行比较。
示例 csv 文件:
Col1,Col2,Col3,Col4
Val1,Val2,Val3,ValNeeded
我使用下面的代码来执行此操作,
varcsv=`sed '2q;d' file.csv | cut -d',' -f4 | tr -d ' '`
myvar=ValNeeded
if [ "$varcsv" = "$myvar" ]; then
echo "true"
else
echo "false"
fi
这段代码的输出是false
,长度varcsv
是10
(甚至长度不正确)。
请告诉我哪里需要更改。
答案1
虽然我将我的答案作为评论发布,但评论已被删除,让我们再试一次:
您接近它的方式是可以的,但可以通过这样的方式进行改进,即您不需要依赖太多的外部二进制文件。例如,要解决您的问题,您可以使用awk
以下方法:
awk -F, -vmyvar="ValNeeded" 'NR==2 { if ($4 == myvar) print "match"; else print "No match"}' file.csv
如果您想保留代码但稍微重写它,它看起来像这样:
#!/bin/bash
varcsv=$(awk -F, 'NR==2 { print $NF }' file.csv)
myvar=ValNeeded
if [[ $varcsv == "$myvar" ]]; then
echo "true"
else
echo "false"
fi
There$NF
获取记录中的最后一个字段。
正如 Philippos 已经提到的,您的文件包含 MSDOS 行结尾,又名 CR/LF。您可以使用 、 cat
、sed
和许多其他工具以不同的方式检查这些内容,od
但让我们保持简单并在本例中使用cat
and :sed
cat -vEt file.csv
或者sed -n l file.csv
这将返回类似以下内容:
Val1,Val2,Val3,SomeVar^M$
Val1,Val2,Val3,ValNeeded^M$
Val1,Val2,Val3,Ignorevar^M$
$
要将这些^M$
字符全部删除,您可以使用一些实用程序。例如:
dos2unix file.csv
。还有其他方法可以在编辑器中执行此操作,但这需要更多努力。
一旦你转换了文件,你应该就可以了。
答案2
这是具有 MSDOS 行结尾(回车+换行)的文件的典型问题。回车符是不可见的,但将成为要比较的字符串的一部分。
您已经发现长度错误,我想您的tr -d ' '
目的是删除尾随空格,但问题不是空格。只需在您的参数中添加一个回车符tr
(通过键入ctrlV后跟 来输入它Return。它将显示为tr -d ' ^M'
。