我正在编写一个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]
答案 0 :(得分:6)
我要将您的数据重新格式化为:
Col #1 Col #2
===== ====
data1 123
data2 456
Col #1 Col #2
==== ====
csv 123
csv2 456
我是否正确设置了此设置?我知道这些将是CSV文件,但我想确保我理解您的数据结构。
现在你说:
我希望得到每个$ col1我想看看$ col1是否等于$ data变量第一列的任何数据。
您希望将 DATA 中的第1列与来自 CSV 的第1列匹配。在您的集合中,两个集合中的两列#1不匹配。你的意思是第2列吗?
我假设您的最终结果应如下所示:
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