Text-Processing

使用 shell 根據分隔符將多列拆分為行

  • August 24, 2022

我有一個製表符分隔的文件,如下所示:

cg13201342  F   ARNT;ARNT;ARNT;CTSK 3'UTR;3'UTR;3'UTR;TSS1500
cg05269359  F   SCN4B;SCN4B;SCN4B;SCN4B 3'UTR;3'UTR;3'UTR;Body
cg06018296  R   NEK3;NEK3;NEK3;NEK3 3'UTR;3'UTR;3'UTR;Body
cg05172994  F   WDR20;WDR20;WDR20;WDR20 3'UTR;3'UTR;3'UTR;Body

期望的輸出:

cg13201342  F   ARNT   3'UTR
cg13201342  F   ARNT   3'UTR
cg13201342  F   ARNT   3'UTR
cg13201342  F   CTSK   TSS1500
cg05269359  F   SCN4B  3'UTR
.
.

等等

我試過了

awk 'BEGIN {
      FS = OFS = "\t"
    }
    {
      n = split($3, f, " *;*")
      for (i=1; i<=n; i++)
        print $1, f[i]
    }' probe-genes-regions >chk

但這只是拆分第三列。我希望最後一列與第二列一起拆分,並分別與第三列的第一個欄位和最後一列的第一個欄位形成行,依此類推

將分號上的欄位 3 和 4 拆分為單獨的數組,然後遍歷它們,例如(假設欄位 3 和 4 具有相同數量的元素):

解析.awk

BEGIN { OFS = "\t" }

{ 
 n = split($3, a, /;/); split($4, b, /;/)
 for(i=1; i<=n; i++)
   print $1, $2, a[i], b[i] 
}

像這樣執行它:

awk -f parse.awk infile

輸出:

cg13201342      F       ARNT    3'UTR
cg13201342      F       ARNT    3'UTR
cg13201342      F       ARNT    3'UTR
cg13201342      F       CTSK    TSS1500
cg05269359      F       SCN4B   3'UTR
cg05269359      F       SCN4B   3'UTR
cg05269359      F       SCN4B   3'UTR
cg05269359      F       SCN4B   Body
cg06018296      R       NEK3    3'UTR
cg06018296      R       NEK3    3'UTR
cg06018296      R       NEK3    3'UTR
cg06018296      R       NEK3    Body
cg05172994      F       WDR20   3'UTR
cg05172994      F       WDR20   3'UTR
cg05172994      F       WDR20   3'UTR
cg05172994      F       WDR20   Body

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