在Shell脚本中读取CSV文件,直到没有标题的行结束
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Shell脚本中读取CSV文件,直到没有标题的行结束相关的知识,希望对你有一定的参考价值。
我有一个名为'readfile.csv'的文件,其中包含以下内容。
Name Id VAl Number IP
James,007,$500,111-111-111,111-000-000
Bond,700,$900,100-000-999, 666-999-000
这里Name, Id, Val, Number and IP
在csv文件中前进,第二行,即FirstVal, SecondVal
等是这些头的值。我想只读取值而不是标题,并在控制台中显示它。我该怎么做?而且我想读取值直到行尾/文件末尾,因为我不知道文件中可以存在多少列。它可以是5或6列。
现在我能够在shell脚本中读取没有标题的单行。但这对我这里提到的情况没有帮助。
#!/bin/bash
val1=( $(cut -d ',' -f1 readfile.csv ) )
printf "%s
" "${val1[0]}"
val2=( $(cut -d ',' -f2 readfile.csv ) )
printf "%s
" "${val2[0]}"
val3=( $(cut -d ',' -f3 readfile.csv ) )
printf "%s
" "${val3[0]}"
我实际上想将这些值附加到其他脚本。例如,我有一个名为runfile.sh的脚本,它附加awk中的值并通过http打开文件位置。
例如,'runfile.sh'存储此值:
'https://my_win_loc/personinfo'
现在runfile将读取csv文件并将每个值附加到此url,如下所示:
'https://my_win_loc/personinfo/James'
'https://my_win_loc/personinfo/Bond'
请帮我解决这个问题。提前致谢。
你应该使用Awk
来完成这些理想的任务。在进一步讨论之前,请阅读FS
中有关变量OFS
,FNR
,NR
,NF
和built-in variables in Awk
page的更多信息。
Awk
一般处理由变量NR
跟踪的一行,所以跳过标题行使用NR>1
即意思,跳过行NR==1
,
变量FS
和OFS
定义了输入和输出线的去限制方式。由于您正在使用.csv
文件,因此将其设置为,
是明智的。一旦这作为BEGIN{}
子句的一部分完成(在处理文件之前执行),可以从$1
..$NF
打印单个字段,其中NF
是每行中由FS
分隔的最大字段数。
所以,
awk 'BEGIN{FS=OFS=","}NR>1{for(i=1;i<=NF;i++) print $i}' input.csv
答案已更新,以符合OP的要求,
awk -v str="https://my_win_loc/personinfo" 'BEGIN{FS=OFS=","} NR>1 {print str"/"$1}' input.csv
通常,这种事情可以使用awk
或简单的read
循环来完成。
#!/bin/bash
exec < readfile.csv || exit 1
read header # read (and ignore) the first line
while IFS=, read name id val number ip; do
echo name = "$name"
echo id = "$id"
echo val = "$val"
echo number = "$number"
test -n "$ip" && echo ip = "$ip"
done
标准的awk
库可用于此目的。要排除标题行,您可以
awk '{if (NR!=1) {print}}' readfile.csv
这里NR是行数。
以上是关于在Shell脚本中读取CSV文件,直到没有标题的行结束的主要内容,如果未能解决你的问题,请参考以下文章
sh 使用bash脚本读取CSV文件 - 来自http://www.theunixschool.com/2012/05/shell-read-text-or-csv-file-and-extract.