Awk

將表中的行轉換為列

  • July 13, 2022

這是我的 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

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