循环通过csv

时间:2012-03-15 17:40:18

标签: bash unix sed awk

我正在编写一个bash shell脚本,我无法拆分stdout csv然后循环遍历它。

我从数据库的stdout获取数据。它以逗号分隔,每行都在自己的行上。我将它存储在一个名为csv的变量中。我对我的数据变量有同样的看法。我从一个返回csv的url的stdout中获取数据...再次以逗号分隔,每行都有自己的行。

下面\ n表示它是一个新行。

我知道如何使用read来迭代并获取csv的任何列(参见下文)。因此,当我回显$ col1时,它会显示两个我期望的结果。

这是我不明白的: 然后我想得到每个$ col1我想看看$ col1是否等于$ data变量第一列的任何数据。如果存在(除非出现问题,它应该总是存在),然后将$ col1的csv添加到数据变量的所有数据中,以添加该数据以形成stdout csv。

csv=$("csv",123\n"csv2",456)
data=$("data1",123\n"data2",456)

echo "$csv" | while IFS=',' read -r col1 col2;do
echo "$col1"
done

需要的例子:

if $csv[$col1] == [any of the values of $data[$col1]] then;
echo $csv[$col1],$data[all of it]

1 个答案:

答案 0 :(得分:6)

我要将您的数据重新格式化为:

DATA

 Col #1    Col #2
 =====     ====
 data1     123
 data2     456

CSV

 Col #1    Col #2
 ====      ====
 csv       123
 csv2      456

我是否正确设置了此设置?我知道这些将是CSV文件,但我想确保我理解您的数据结构

现在你说:

  

我希望得到每个$ col1我想看看$ col1是否等于$ data变量第一列的任何数据。

您希望将 DATA 中的第1列与来自 CSV 的第1列匹配。在您的集合中,两个集合中的两列#1不匹配。你的意思是第2列吗?

我假设您的最终结果应如下所示:

DATA

CVS Value    Col #1     Col #2
=========    ======     ======
csv          data1      123
csv2         data2      456

(但当然是csv格式)。

这是对的吗?

如果你有一个相当现代的BASH版本,你可以使用关联数组。这使您可以使的概念等于

假设您使用DATA和CSV创建一个关联数组,其中数组由第2列键入,然后您可以通过数组,并确定是否存在匹配值,并以您希望的方式输出数据

您可以通过以下方式设置关联数组值:

my_array[key]="value"

您可以像这样获取与键相关联的值:

echo "${my_array[key]}"

您可以获得所有值的列表,如下所示:

echo "${my_array[*]}"

你可以得到这样的所有键:

echo "${my_array[@]}"

这是一个快速而肮脏的程序。您可能需要一些东西来验证您在创建阵列时没有重复的键,并且在打印阵列时特定键具有与之关联的值:

#! /bin/bash
csv="csv,123
csv2,456"

data="data1,123
data2,456"

# Create the Data Array Hash keyed by Col #2
while IFS="," read -r col1 col2
do
    data_array[$col2]=$col1
done <<EOD
$data
EOD


# Create the CSV Array Hash keyed by Col #2
while IFS="," read -r col1 col2
do
    csv_array[$col2]=$col1
done <<EOD
$csv
EOD

#For each key in Data Hash, print out corresponding keyed value in CSV Hash
for key in "${!data_array[@]}"
do
    echo "$key: ${data_array[$key]} ${csv_array[$key]}"
done