2014-10-31 38 views
0

的第一行我有一组文件,当cat'ed在一起的格式击:我如何偷看并保存标准输入

NAME1.1 NAME2.1 NAME3.1 KEY1 VALUE1.1 KEY2 VALUE2.1 
NAME1.2 NAME2.2 NAME3.2 KEY1 VALUE1.2 KEY2 VALUE2.2 
... 
NAME1.N NAME2.N NAME3.N KEY1 VALUE1.N KEY2 VALUE2.N 

,并通过键值对文字阅读的报价繁琐,所以我想到了一个处理脚本是为了让我写了这个

#!/bin/bash 
cat "[email protected]" \ 
    | head -n1 \ 
    | awk '{printf("NAME1 NAME2 NAME3 ");for(i=4;i<NF;i+=2){printf("%s ",$i)}printf("\n")}' 

cat "[email protected]" \ 
    |awk '{printf("%s %s %s ",$1,$2,$3);for(i=5;i<=NF;i+=2){printf("%s ",$i)}printf("\n")}' 

正如你可以看到我在玩的文件只是两次抢标题行,所以我可以得到的值,并将其格式化为

NAME1 NAME2 NAME3 KEY1  KEY2 
NAME1.1 NAME2.1 NAME3.1 VALUE1.1 VALUE2.1 
NAME1.2 NAME2.2 NAME3.2 VALUE1.2 VALUE2.2 
... 
NAME1.N NAME2.N NAME3.N VALUE1.N VALUE2.N 

有没有一种很好的方法来查看并复制第一行,以便我可以保存它?

我已经尝试了一个衬垫这样

(cat *.all_my_files \ 
    | tee >(head -n1 | awk '{printf("NAME1 NAME2 NAME3 ");for(i=4;i<NF;i+=2){printf("%s ",$i)}printf("\n")}') \ 
    | awk '{printf("%s %s %s ",$1,$2,$3);for(i=5;i<=NF;i+=2){printf("%s ",$i)}printf("\n")}' \ 
) | column -t 

但这似乎退出时任stdouts的完成给我输出的不确定量

回答

2

好像你可以只通过所有在一次和文件AWK做一些特别的第一条记录:

awk 'NR==1{printf("NAME1 NAME2 NAME3 ");for(i=4;i<NF;i+=2){printf("%s ",$i)}print ""} 
    {printf("%s %s %s ",$1,$2,$3);for(i=5;i<=NF;i+=2){printf("%s ",$i)}' "[email protected]" 

第一座将只执行时NR==1,这是唯一真正的˚F或第一个文件的第一条记录。另一个块将执行所有记录,包括第一个记录。