使用Shell脚本从文件中提取一行

3
我有一个CSV文件,其中包含以下列:
User     Name   Env   Role
user1    pap    dev    dev
user2    nic    uat    test

我需要根据列“Env”或“User”提取一行。 我编写的脚本是“extract.sh”,其内容如下:

k=$2
field=$3
head -1 $1; cat $1 | awk -F "," -v k=`echo $k` -v field=`echo $field` '{ k=k;j=$field; if ( j==k )  print $0}'

这个脚本被使用3个参数调用,像这样:sh extract.sh username.csv dev 3,第一个参数是csv文件,第二个是值,第三个是列号,我得到的输出结果是:

User Name Env Role
user1 pap dev  dev

但是我需要的输出应该像这样:
User = user1 
Name = pap
Env = dev
Role = dev

请问有人能帮我获取这个吗?


1
你正在做太多的工作来分配awk变量:-v k="$k" -v field="$field" - glenn jackman
1个回答

3
您可以使用以下awk命令:
awk -F, -v RS='\r\n' -v col=$3 -v val="$2" 'NR==1 {for (i=1; i<=NF; i++) hdr[i]=$i;next}
             $col == val {for (i=1; i<=NF; i++) print hdr[i], "=", $i; exit}' "$1"
User = user1
Name = pap
Env = dev
Role = dev

Explanation:
解释:
NR == 1      # For first row save headers in an array called hdr
$col == val  # when passed val is same as the value of column indicated by col

请问你是如何传递文件名参数的? - user2112700
我没有得到输出,也没有错误。有什么想法吗? - user2112700
直接从命令行运行此awk,如下所示:awk -v col=3 -v val='dev' 'NR==1{for (i=1; i<=NF; i++) hdr[i]=$i; next} $col == val {for (i=1; i<=NF; i++) print hdr[i], "=", $i; exit}' file。这将给我附在答案中的输出。 - anubhava
我尝试使用dos2unix将文件转换为Unix,但出现了错误“无法转换文件filename.csv”。 - user2112700
让我们在聊天中继续这个讨论 - user2112700
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接