我正在写一个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)
我要将您的数据重新格式化为:
Col #1 Col #2
===== ====
data1 123
data2 456
Run Code Online (Sandbox Code Playgroud)
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)