循环通过csv

use*_*223 1 unix bash awk sed

我正在写一个bash shell脚本,我在分割stdout csv然后循环它时遇到了麻烦.

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

在\n下面\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
Run Code Online (Sandbox Code Playgroud)

需要的例子:

if $csv[$col1] == [any of the values of $data[$col1]] then;
echo $csv[$col1],$data[all of it]
Run Code Online (Sandbox Code Playgroud)

Dav*_* W. 7

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

数据

 Col #1    Col #2
 =====     ====
 data1     123
 data2     456
Run Code Online (Sandbox Code Playgroud)

CSV

 Col #1    Col #2
 ====      ====
 csv       123
 csv2      456
Run Code Online (Sandbox Code Playgroud)

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

现在你说:

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

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

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

数据

CVS Value    Col #1     Col #2
=========    ======     ======
csv          data1      123
csv2         data2      456
Run Code Online (Sandbox Code Playgroud)

(但当然是以csv格式).

它是否正确?

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

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

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

my_array[key]="value"
Run Code Online (Sandbox Code Playgroud)

你可以得到与key相关的值,如下所示:

echo "${my_array[key]}"
Run Code Online (Sandbox Code Playgroud)

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

echo "${my_array[*]}"
Run Code Online (Sandbox Code Playgroud)

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

echo "${my_array[@]}"
Run Code Online (Sandbox Code Playgroud)

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

#! /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
Run Code Online (Sandbox Code Playgroud)