与csv文件值比较

与csv文件值比较

我有一个 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,长度varcsv10(甚至长度不正确)。

请告诉我哪里需要更改。

答案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。您可以使用 、 catsed和许多其他工具以不同的方式检查这些内容,od但让我们保持简单并在本例中使用catand :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'

相关内容