Linux

如何通過組合 linux 上的其他兩個列在 tsv 文件中創建一個新列?

  • August 31, 2021

我有 70 個目錄,其中包含如下文件:

STAN002
  |______ STAN002_sasions.tsv
PTAN044
  |______ PTAN044_sasions.tsv
STAN005
  |______ STAN005_sasions.tsv
STAN050
  |______ STAN050_sasions.tsv
QRED034
  |______ QRED034_sasions.tsv
.
.
.
PREC098
  |______ PREC098_sasions.tsv

上述目錄中的每個.tsv文件都有相同的列數(30 列),如下圖所示:

在此處輸入圖像描述

文件中的第 1 列和第 2 列.tsv如下所示:

#gene1    gene2
VAV1      THAP4
ZNF75A    ZNF263
KRCC1     POLR1A
H2AFV     TANC1
B3GALT6  RP3-340N1.5
SH3BP1   CTD-2013M15.1(192243),EMB(3603711)
PTPRO     VASN

現在,在 linux 上使用awk or any bash script我想.tsv在目錄中的所有文件中創建一個新列。新創建的列將31st column在文件中。

它應該像組合1st and 2nd columns名稱由 . 分隔的位置--31st column應該如下所示:

gene1--gene2
VAV1--THAP4
ZNF75A--ZNF263
KRCC1--POLR1A
H2AFV--TANC1
B3GALT6--RP3-340N1.5
SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO--VASN

我嘗試過這種方式,但出錯了:

awk '{print $0, $1 "-" $NF}' STAN002_sasions.tsv

如何在所有文件的單個腳本中在 linux 上執行此操作?任何幫助表示讚賞。

您的腳本失敗,因為您沒有指定FSorOFS並且您使用$NF而不是$2辨識第二個欄位(並"-"在您想要的時候使用,"--"但那是 nbd)。

不過你很接近,試試這個:

$ awk 'BEGIN{FS=OFS="\t"} {print $0, $1 "--" $2}' STAN002_sasions.tsv
#gene1  gene2   #gene1--gene2
VAV1    THAP4   VAV1--THAP4
ZNF75A  ZNF263  ZNF75A--ZNF263
KRCC1   POLR1A  KRCC1--POLR1A
H2AFV   TANC1   H2AFV--TANC1
B3GALT6 RP3-340N1.5     B3GALT6--RP3-340N1.5
SH3BP1  CTD-2013M15.1(192243),EMB(3603711)      SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO   VASN    PTPRO--VASN

或者,如範例輸入/輸出中所示,輸入文件第一行的第一個欄位可以真正以 a 開頭,#在創建新列標題時必須刪除該欄位,然後:

$ awk 'BEGIN{FS=OFS="\t"} {g=$1} NR==1{sub(/^#/,"",g)} {print $0, g "--" $2}' STAN002_sasions.tsv
#gene1  gene2   gene1--gene2
VAV1    THAP4   VAV1--THAP4
ZNF75A  ZNF263  ZNF75A--ZNF263
KRCC1   POLR1A  KRCC1--POLR1A
H2AFV   TANC1   H2AFV--TANC1
B3GALT6 RP3-340N1.5     B3GALT6--RP3-340N1.5
SH3BP1  CTD-2013M15.1(192243),EMB(3603711)      SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO   VASN    PTPRO--VASN

如果您已經或可以安裝 GNU awk 以進行“就地”編輯並希望立即更新所有文件(顯然用script您決定使用的上述 2 個腳本中的任何一個替換字元串):

awk -i inplace 'script' */*_sasions.tsv

否則,這將需要更長的時間來執行:

tmp=$(mktemp) || exit
for file in */*_sasions.tsv; do
   awk 'script' "$file" > "$tmp" &&
   mv -- "$tmp" "$file"
done

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