Shell
如何根據第一行的資訊對一堆行進行分組?
我有一個數據文件看起來像:
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 列,或者在序列的末尾。