shell中如何利用awk遍历提取特定列

假设每行的列数相同,f为文件路径。先用NF获取列数,再通过awk的-v选项自定义变量作为要提取的列,不然外面的变量根本放不进去。

n=$(awk 'NR==1 {print NF}' $f) #先获取每行的列数存储到n上
for (( i=1;i<=n;i++ )); do #循环输出
	#使用awk提取特定列直接输出
	b=$(awk -v num="$i" '{print $num}' $f)
	echo "输出: "$b #这个就一行输出,所需的
	echo "输出: $b" #这个会换行输出b
done

设文件内容为


job salary 10
c++ 13 uh
java 14 asij
php 12 aif

那么关于输出,这里有个很有趣的地方,$b放双引号里面输出会带换行,即类似

输出:job

c++

java

php


而把$b放双引号外面,输出就不会换行,即

输出: job c++ java php
 


原因搜了一下,具体来说,当使用双引号(")时,Bash 会解析变量和特殊字符。所以 `"输出: $b"` 会被解析为字符串 "输出 " 和变量 `$b` 的值。而 `"输出: "$b` 是将字符串 "输出: " 和变量 `$b` 的值拼接在一起,所以 `$b` 的值会被输出。说实话,没看懂。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值