awk行列转换(字符串拼接)

行列转换1

cat file.txt
name  age
alice  21
rayn  30
#转换得到
#name alice rayn
#age 21 30


# 1.将每一行每一列全部保存起来,最后在END语句块当中输出
cat file.awk
{
    # 循环取得所有列
    for(i=1;i<=NF;i++){
        # 如果在数组中就把每列数据追加到已有的数据中
        if(i in arr){
            # 表示把" " $i追加到数组元素后面去
            arr[i]=arr[i]" " $i
        }else{
            # 如果不在数组当中,就把$i赋值给arr[i]
            arr[i]=$i
        }
    }
}
END{
    for(i=1;i<=NF;i++){
        print arr[i]
    }
}
awk -f file.awk file.txt

行列转换2

cat file.txt
74683 1001
74683 1002
74683 1011
74683 1000
74684 1001
74684 1002
74685 1011
100085 1000
100086 1001
cat file.awk
{
    if($i in arr){
        arr[$1]=arr[$1]" " $2 
    }else{
        arr[$1]=$2   
    }  
}
END{
    for(i in arr){
        printf "%s %s\n",i,arr[i]
    }
}
awk -f file.awk file.txt

字符串拼接

cat testfile 
clone=line1
gb=line1
gi=line1
lib=line1
gb=line2
gi=line2
lib=line2
clone=line3
gb=line3
gi=line3
lib=line3
gb=line4
gi=line4
lib=line4

cat testfile |awk '!/lib/{a=$0" "a}/lib/{print $0,a,a=""}'
lib=line1 gi=line1 gb=line1 clone=line1  
lib=line2 gi=line2 gb=line2  
lib=line3 gi=line3 gb=line3 clone=line3  
lib=line4 gi=line4 gb=line4  

解释:

  • 没有过滤到lib(/lib/)就执行{a=$0" "a}
  • 过滤到lib(/lib/)就执行{print $0,a,a=""}

两个时间列在一行

cat test1
first
00:15:01
01:44:06
second
01:44:06
17:53:00
three
17:54:08
24:00:03

awk '/^[0-9]/{sum++;if(sum%2){printf $0" ";next}}1' test1
first
00:15:01 01:44:06
second
01:44:06 17:53:00
three
17:54:08 24:00:03

解释:

  • sum是计数器,如果过滤到时间行(/^[0-9]/),计数器就自加
  • if(sum%2),如果sum是奇数,模2余数是1,表示成功,就printf就不换行
  • 如果sum是偶数,模2余数是0,表示不成功,

显示为一列

# 方法一
xargs   <filename

# 方法二
tr " " "\n" <tmp

# 方法三
awk -v RS="[ \n]" '1' tmp
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值