2015-08-19 28 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。
也許這樣更具可讀性。