2015-08-19 29 views
0

我输入文件看起来像这样,awk的单柱的多个列

0 1.0069770730517629  
0 1.0068122761874614  
0 1.0004297763706849  
1 1.0069220626905635  
1 1.0079998216945956  
1 1.0006092898635817  
2 1.0071274842017928  
2 1.0083750686808803  
2 1.0006868227863552  
3 1.0073693844413083  
3 1.0086546525825624  
3 1.0007234442925264 

而且我想要的输出文件看起来像这样,

0 1.0069770730517629  1.0068122761874614  1.0004297763706849  
1 1.0069220626905635  1.0079998216945956  1.0006092898635817  
2 1.0071274842017928  1.0083750686808803  1.0006868227863552  
3 1.0073693844413083  1.0086546525825624  1.0007234442925264 

我想用grep或awk来拆分单列到多个。 任何人都可以帮我,请问?

+0

你试过了什么? – pfnuesel

+0

您是否想将每3行合并为一行或每行以相同数字开头的行合并为一行? –

+0

我想将每3行以相同数字开头的行合并为一行。 – Kinder

回答

2

既然你具体说明“结合三线”:

paste - - - < file | awk -v OFS=" " '{print $1, $2, $4, $6}' 

我要去假设文件已经排序。

另取:刚awk和没有关于分类的烦躁假设

gawk -v OFS=" " ' 
    {values[$1] = values[$1] OFS $2} 
    END { 
     PROCINFO["sorted_in"] = "@ind_num_asc" 
     for (key in values) print key values[key] 
    } 
' file 
+0

'粘贴',好主意!另一种可能性:'printf'%s%s%s%s%s%s \ n“$( Cyrus

+2

@Cyrus或'printf'%s%s%.0s%s%.0s%s \ n “$(

+0

@BinaryZebra:完美!只有Bash。作为回答发布。 – Cyrus

1

使用pr用相同的另一种选择AWK结束

pr -3at file | awk -v OFS="\t" '{print $1,$2,$4,$6}' 

使用标签分隔符,而不是空格。

1

这工作(在bash和zsh中):

printf "%s %s%.s %s%.s %s\n" $(< file) 

或者更便携,如printf和猫都可以几乎无处不在。 (我不认为这有资格的useless "use of cat" award,或者我希望如此:)

printf "%s %s%.s %s%.s %s\n" $(cat file) 

只有当且仅当:

  • 文件是有序的,所有的第一列的值在一起,

  • 正好有3个值要打印。

需要的printf的a trickavoid printing some fields,或用更精确的文字: “从字符串打印0个字符”: “%.S”。

的原始灵感来自赛勒斯为:printf "%s %s %s %s %s %s\n" $(< file)

1

这个答案并不能使约值要打印的数量做任何假设,也不假定该文件是有序的。

#!/bin/bash 

sort -n "file.csv" > "file.csv.tmp" 

awk -v lastline="false" '{ 
    if (lastline != $1) 
    { 
     if (NR>1) { printf "\n"}; 
     {printf "%s %s", $1, $2; lastline=$1; next}; 
    } 
    else { printf " %s", $2}; 

} END { printf "\n"}' "file.csv.tmp" #>"file.csv" 

该程序首先排序文件,以确保所有$1值都在一起。

然后使用lastline的值来控制动作。
变量lastline最初设置为false以确保它与$1的值不匹配。
如果lastline不是重复(不匹配$1),将打印$1$2的值。 ...并且lastline已更新至此$1值。
如果lastline是重复的(等于$1),则只打印$2
要使格式正确,每行“新”$1行都会打印一个换行符。 ...最后。

如果需要替换原始的“file.csv”,则删除注释字符(#)以允许在最后一行中重定向。

将循环更改为if ... else。
也许这样更具可读性。