如何解决在csv文件中查找列的索引号,但是命令不显示结果?
我想获取CSV列的索引号,具体取决于列名。
例如,我有以下列:TotalReported;Deceased;City
我尝试这样做:
head -n1 data.csv | tr ";" "\n" | grep -nx "Deceased" | cut -d";" -f1
,但未打印任何内容。 我也尝试这样做:
awk -F,'{ for(i=1; i<=NF; i++) if($i=="Deceased") {print i} exit}' data.csv'
不打印任何内容。 我该怎么办?
这是data.csv
文件的内容:
Date_of_report;Municipality_code;Municipality_name;Province;Total_reported;Hospital_admission;Deceased
2020-03-13 10:00:00;GM0003;Appingedam;Groningen;0;0;0
2020-03-13 10:00:00;GM0010;Delfzijl;Groningen;0;0;0
2020-03-13 10:00:00;GM0014;Groningen;Groningen;3;0;0
2020-03-13 10:00:00;GM0024;Loppersum;Groningen;0;0;0
2020-03-13 10:00:00;GM0034;Almere;Flevoland;1;1;0
2020-03-13 10:00:00;GM0037;Stadskanaal;Groningen;0;0;0
2020-03-13 10:00:00;GM0047;Veendam;Groningen;0;0;0
2020-03-13 10:00:00;GM0050;Zeewolde;Flevoland;1;0;0
2020-03-13 10:00:00;GM0059;Achtkarspelen;Friesland;0;0;0
2020-03-13 10:00:00;GM0060;Ameland;Friesland;0;0;0
2020-03-13 10:00:00;GM0072;Harlingen;Friesland;0;0;0
2020-03-13 10:00:00;GM0074;Heerenveen;Friesland;0;0;0
基本上我想获取一列的索引号,然后将索引号放入此awk
命令中
v1=$(awk -F";" '{x+=$index}END{print x}' ./data.csv)
并获得该特定列的所有数字的总和。最后三列很重要,因为您当然只能对它们进行求和。
解决方法
使用egrep -o
获取该行的开始并计算分号:
echo 'TotalReported;Deceased;City' | egrep -o '.*Deceased' | sed -e 's/[^;]//g' | wc -c
输出为2
,因为“已故”位于第二列。
请您仅尝试使用所示示例进行以下操作,编写和测试。
awk '
BEGIN{
FS=";"
}
{
gsub(/\r/,"")
for(i=1;i<=NF;i++){
if($i=="Deceased"){
print "Index is:"i
exit
}
}
}
' Input_file
或者,如果您的字符串可以是任何东西,则可以创建一个名为awk
的{{1}}变量,并可以根据要查找其索引的字符串来分配其值。
strSearch
输出如下。
awk -v strSearch="Deceased" '
BEGIN{
FS=";"
}
{
gsub(/\r/,"")
for(i=1;i<=NF;i++){
if($i==strSearch){
print "Index is:"i
exit
}
}
}
' Input_file
,
echo "Date_of_report;Municipality_code;Municipality_name;Province;Total_reported;Hospital_admission;Deceased" | awk -F';' '{ for(i=1; i<=NF; i++) if($i=="Deceased") {print i} exit}'
这将打印“ 7”。 注意分号,而不是逗号。
,注意:使用@TheSlater版本,它更简洁,更好。
但是当我要粘贴我的shell脚本时:
if [ $# -ne 2 ];
then
echo "Usage: $0 <file_name> <column_to_find>"
exit 255
fi
I=1
FILE_NAME=$1
GOAL_COL=$2
head -1 $FILE_NAME > TMP
current_col=`cut -d";" -f$I TMP`
while [ ! -z $current_col ] && [ $current_col != $GOAL_COL ]
do
((I++))
current_col=`cut -d";" -f$I TMP`
done
if [ -z $current_col ];
then
echo "NOTFOUND"
else
echo "$I"
fi
rm TMP
exit 0
以防万一有人觉得有用
编辑:
$ sh findIndex.sh th.csv Deceased
7
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。