行列转换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