Awk
將表中的行轉換為列
這是我的 1.file(分隔符是“\t”)
ot1 a a,b,c,d,e ot2 b b,c,q ot3 c c,f,g ot4 e a,g,e
我想得到 2.file (分隔符是 “\t”)
ot1 a a ot1 a b ot1 a c ot1 a d ot1 a e ot2 b b ot2 b c ot2 b q ot3 c c ot3 c f ot3 c g ot4 e a ot4 e g ot4 e e
首先,我嘗試了 “sed -i “s/,/\n/g”,但我不知道下一步該做什麼?感謝您的幫助。
像這樣的東西可以做這項工作:
awk -F\\t 'BEGIN {OFS=FS} {n=split($3,aa,",");for (i=1;i<=n;i++) {$3=aa[i]; printf "%s\n" $0 }}'
第一個製表分隔符需要雙重轉義
然後拆分第 3 個標記並獲取拆分數組中的元素數
然後用拆分的元素替換循環中的第 3 個標記並列印
米勒會在這里工作:
mlr --tsv -N nest --explode --values --across-records --nested-fs "," -f 3 1.file > 2.file
解釋
--tsv
- 使用製表符分隔值文件格式進行輸入和輸出
-N
- 使用數字 ID 來處理欄位,而不是標題名稱
nest
- 數據是嵌套的
--explode
- 爆炸嵌套數據
--values
- 嵌套數據是單個值
--across-records
- 將分解的數據寫入單獨的記錄
--nested-fs
- 嵌套值的欄位分隔符
-f 3
- 根據欄位編號爆炸。3