Linux
如何通過組合 linux 上的其他兩個列在 tsv 文件中創建一個新列?
我有 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 上執行此操作?任何幫助表示讚賞。
您的腳本失敗,因為您沒有指定
FS
orOFS
並且您使用$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