Linux 在Shell脚本中读取CSV文件,直到行尾没有标题为止

Linux 在Shell脚本中读取CSV文件,直到行尾没有标题为止,linux,shell,unix,awk,Linux,Shell,Unix,Awk,我有一个名为“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和IP是csv文件中的标题,第二行即FirstVal、SecondVal等是这些标题的值。我只想读取值,不想读取标题,并在控制台中显示它。我该怎么做?我还

我有一个名为“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和IP
是csv文件中的标题,第二行即
FirstVal、SecondVal
等是这些标题的值。我只想读取值,不想读取标题,并在控制台中显示它。我该怎么做?我还想读取值,直到行结束/文件结束,因为我不知道文件中可以存在多少列。它可以是5列或6列

现在,我能够在shell脚本中阅读一行没有标题的代码,如下所示。但这无助于我在这里提到的情况

#!/bin/bash

val1=( $(cut -d ',' -f1 readfile.csv ) )
printf "%s\n" "${val1[0]}"
val2=( $(cut -d ',' -f2 readfile.csv ) )
printf "%s\n" "${val2[0]}"
val3=( $(cut -d ',' -f3 readfile.csv ) )
printf "%s\n" "${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
库可用于此目的。要排除标题行,可以

awk '{if (NR!=1) {print}}' readfile.csv

这里的NR是行数

标准
awk
库可用于此目的。要排除标题行,可以

awk '{if (NR!=1) {print}}' readfile.csv

这里的NR是行数

对于这类任务,您可能应该使用
Awk
。在继续之前,请阅读本节中有关变量
FS
OFS
FNR
NR
NF
的更多信息

Awk
通常一次处理一行,由变量
NR
跟踪,因此使用
NR>1
跳过标题行,即跳过行
NR==1

变量
FS
OFS
定义输入和输出行的解除限制方式。由于您使用的是
.csv
文件,因此最好将其设置为
。一旦这作为
BEGIN{}
子句的一部分完成(在文件处理之前执行),就可以从
$1
打印各个字段。
$NF
其中
NF
是每行中由
FS
分隔的最大字段数

所以


您可能应该使用
Awk
来完成这些理想的任务。在继续之前,请阅读本节中有关变量
FS
OFS
FNR
NR
NF
的更多信息

Awk
通常一次处理一行,由变量
NR
跟踪,因此使用
NR>1
跳过标题行,即跳过行
NR==1

变量
FS
OFS
定义输入和输出行的解除限制方式。由于您使用的是
.csv
文件,因此最好将其设置为
。一旦这作为
BEGIN{}
子句的一部分完成(在文件处理之前执行),就可以从
$1
打印各个字段。
$NF
其中
NF
是每行中由
FS
分隔的最大字段数

所以


通常,这类事情可以通过
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
#/bin/bash
exec
通常,这类事情可以通过
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
#/bin/bash
exec
谢谢你,伊尼安。在执行上面提到的awk行时,我将获得带有标题的输出。名称Id VAl编号IP。我可以存储在新行上的值,但仍然是标题visible@Raji:很抱歉,这是一个错误,未能在命令中添加
NR>1
。试试看now@Raji:这将在单独的行中打印每个元素(不包括标题)。您想怎么打印?你能举个例子吗?非常感谢。标题随着修改后的线条消失了。我想在新行中显示如下代码:val1:FirstVal Val2:secondval上述所有代码都在新行中。我无法编辑评论以放入新行谢谢你,伊尼安。在执行上面提到的awk行时,我将获得带有标题的输出。名称Id VAl编号IP。我可以存储在新行上的值,但仍然是标题visible@Raji:很抱歉,这是一个错误,未能在命令中添加
NR>1
。试试看now@Raji:这将在单独的行中打印每个元素(不包括标题)。您想怎么打印?你能举个例子吗?非常感谢。标题随着修改后的线条消失了。我想在新行中显示如下代码:val1:FirstVal Val2:secondval上述所有代码都在新行中。我无法编辑评论以放入新的lineHi Billalsamioguz。谢谢你的回复。代码工作正常,但显示带有逗号的输出。伊尼安帮助修正了密码。嗨,比拉尔萨米奥古斯。谢谢你的回复。代码工作正常,但显示带有逗号的输出。伊尼安帮助修复了代码。