簡體   English   中英

重擊:用另一列替換列並使用AWK打印特定順序

[英]Bash: replacing a column by another and using AWK to print specific order

我有一個虛擬文件,看起來像這樣:

a ID_1 S1 S2
b SNP1 1 0
c SNP2 2 1
d SNP3 1 0

我想用相應的行號替換第2列的內容。 我的文件將如下所示:

a 1 S1 S2
b 2 1 0
c 3 2 1
d 4 1 0

我可以使用以下命令執行此操作:

cut -f 1,3-4 -d " " file.txt | awk '{print $1 " " FNR " " $2,$3}'

我的問題是,有更好的方法嗎? 特別是,我正在處理的實際文件有2303列。 顯然我不想寫:

cut -f 1,3-2303 -d " " file.txt | awk '{print $1 " " FNR " " $2,$3,$4,$5 ETC}'

有沒有一種方法可以告訴awk從第2列打印到最后一列,而不必寫下所有名稱?

謝謝

我認為這應該做

$ awk '{$2=FNR} 1' file.txt 
a 1 S1 S2
b 2 1 0
c 3 2 1
d 4 1 0

更改第二列並打印更改的記錄。 默認的OFS是單個空間,這是您在這里需要的


上面的命令是慣用的寫法

awk '{$2=FNR} {print $0}' file.txt 

您可以將簡單的awk程序視為awk 'cond1{action1} cond2{action2} ...'

僅當cond1評估為true時,才會執行action1 ,依此類推。 如果省略了action部分,則默認情況下, awk打印輸入記錄。 1只是寫入始終為真的條件的一種方法

有關更多此類習語,請參見https://stackoverflow.com/tags/awk/info中提到的慣用awk

跟隨awk也可以在這里幫助您。

awk '{sub(/.*/,FNR,$2)} 1'  Input_file

輸出如下。

a 1 S1 S2
b 2 1 0
c 3 2 1
d 4 1 0

說明:它的解釋很簡單,使用awk sub實用程序將$2 (第二個字段)中的所有內容替換$2 FNR ,這是awk的現成變量,代表任何Input_file的當前行號,然后提及1將打印當前行Input_file。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM