Shell

如何根據第一行的資訊對一堆行進行分組?

  • January 31, 2016

我有一個數據文件看起來像:

1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3  . . .
1 0 4 4 3 1 2 0 0 0 3 1 1 2 1 1 1 1 1 1 0 1 1 3  . . .
0 0 0 0 0 0 0 3 3 1 1 2 3 2 1 2 2 3 1 2 3 1 2 2  . . .          
.
.
.

首先,我想通過查看第一行,在每 5 個相同的值之間插入空格,將每 5 個相同的數字保持在一個列中,然後我不希望在這些組字元之間留有空格:第一步:

1 1 1 1 1  1 1 1 1 1  1  2 2 2 2 2  2 2 2  3 3 3 3 3  . . .
1 0 4 4 3  1 2 0 0 0  3  1 1 2 1 1  1 1 1  1 0 1 1 3  . . .
0 0 0 0 0  0 0 3 3 1  1  2 3 2 1 2  2 3 1  2 3 1 2 2  . . .          
.
.
.

secuns 步驟(輸出):

11111  11111  1  22222  222  33333  . . .
10443  12000  3  11211  111  10113  . . .
00000  00331  1  23212  231  23122  . . .          
.
.
.

同時,在我龐大的真實數據中,我可能想嘗試不同的組大小。所以我需要腳本靈活..有什麼建議嗎?

awk的其他變體

awk '
   NR==1{
       for(i=2;i<=NF;i++){
           count++
           if($(i-1)!=$i || count>4){
               D[i]=1
               count=0
           }
       }
    }
    {
       for(i in D)
           $i=" "$i
           print
    }
    ' OFS="" data.file >new.file

sed

sed -re '
   s/ +//g;s/^/\n/
   ' -f <(
       sed -r '
           s/(. )\1*/s_\\n(&)_\n/g
           s/\S /./g
           s/\n\s*/\\1 \\n_\n/g
           s/\\n[^\n]*\n$/ \\n__/
           1q
       ' data.file
       ) -e '
   s/\S{5}/& /g
   ' data.file >new.file

這是一個 awk 腳本。您只需更改數字5即可進行其他分組。

awk '
NR==1{
previous = $1
for(i = 1;i<=NF+1;i++)
 if($i!=previous){
   col[++numcol] = i
   previous = $i
 }
}
{ j = 1; start = 1
 for(i = 1;i<NF;i++){
  printf "%s",$i
  if(i==col[j]-1){printf "  "; start = col[j++]}
  else if((i-start+1)%5==0)printf "  "
 }
 printf "%s\n",$NF
}'

第一部分只處理第 1 行,並在數組中收集col每組相同數字的起始列。第二部分列印沒有分隔的每個欄位,除非在起始列的第 5 列,或者在序列的末尾。

引用自:https://unix.stackexchange.com/questions/258753