這可能是基本的,但我對命令列和使用 awk 完全陌生。我有一個這樣的檔案:
1 RQ22067-0 -9
2 RQ34365-4 1
3 RQ34616-4 1
4 RQ34720-1 0
5 RQ14799-8 0
6 RQ14754-1 0
7 RQ22101-7 0
8 RQ22073-1 0
9 RQ30201-1 0
我希望第 3 列中的 0 變為 1。并且 1 和 2 的任何出現都將在第 3 列中更改為 2。所以基本上只更改第 3 列中的數字。但我沒有更改 -9。
1 RQ22067-0 -9
2 RQ34365-4 2
3 RQ34616-4 2
4 RQ34720-1 1
5 RQ14799-8 1
6 RQ14754-1 1
7 RQ22101-7 1
8 RQ22073-1 1
9 RQ30201-1 1
我試過使用(見下文)但它沒有用
>> awk '{gsub("0","1",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno
>> awk '{gsub("1","2",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno
謝謝你。
uj5u.com熱心網友回復:
在您的問題中使用此代碼:
awk '{gsub("0","1",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno
awk '{gsub("1","2",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno
您在同一個輸入檔案上運行兩個命令并將它們的輸出寫入同一個輸出檔案,因此輸出中只會出現第二個腳本的輸出,并且
您嘗試先將 0 更改為 1,然后將 1 更改為 2,因此從 0 開始的 $3 最終將變為 2,您需要更改操作的順序。
這是您應該使用現有代碼執行的操作:
awk '{gsub("1","2",$3); gsub("0","1",$3)}1' PRS_with_minus9.pheno.txt > PRS_with_minus9_modified.pheno
例如:
$ awk '{gsub("1","2",$3); gsub("0","1",$3)}1' file
1 RQ22067-0 -9
2 RQ34365-4 2
3 RQ34616-4 2
4 RQ34720-1 1
5 RQ14799-8 1
6 RQ14754-1 1
7 RQ22101-7 1
8 RQ22073-1 1
9 RQ30201-1 1
Thegsub()也應該是sub()s 因為您只想執行每個替換一次,并且您不需要將數字括在引號中,因此您可以這樣做:
awk '{sub(1,2,$3); sub(0,1,$3)}1' file
uj5u.com熱心網友回復:
您可以檢查第 3 列的值,然后更新欄位值。
檢查 1 作為第一條規則,因為如果第一次檢查是 0,則該值將設定為 1,而下一次檢查會將值設定為 2,結果為所有 2。
awk '
{
if($3==1) $3 = 2
if($3==0) $3 = 1
}
1' file
輸出
1 RQ22067-0 -9
2 RQ34365-4 2
3 RQ34616-4 2
4 RQ34720-1 1
5 RQ14799-8 1
6 RQ14754-1 1
7 RQ22101-7 1
8 RQ22073-1 1
9 RQ30201-1 1
uj5u.com熱心網友回復:
使用您顯示的示例和三元運算子嘗試以下代碼。簡單的解釋是,如果第三個欄位為 1,則檢查條件,然后將其設定為 2,否則檢查其是否為 0,然后將其設定為 0,否則保持原樣,最后列印該行。
awk '{$3=$3==1?2:($3==0?1:$3)} 1' Input_file
通用解決方案:在此處添加通用解決方案,我們可以在其中awk命名3 個變數:fieldNumber您可以在其中提及我們要檢查的所有欄位編號。第二個是:existValue我們想要匹配(在條件下),第三個是:newValue替換后需要存在的新值。
awk -v fieldNumber="3" -v existValue="1,0" -v newValue="2,1" '
BEGIN{
num=split(fieldNumber,arr1,",")
num1=split(existValue,arr2,",")
num2=split(newValue,arr3,",")
for(i=1;i<=num1;i ){
value[arr2[i]]=arr3[i]
}
}
{
for(i=1;i<=num;i ){
if($arr1[i] in value){
$arr1[i]=value[$arr1[i]]
}
}
}
1
' Input_file
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E 's/\S /\n&\n/3;h;y/01/12/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n.*/\2\1/' file
用換行符環繞第 3 列。
復印一份。
用0's替換 all 's1和 all 1's by 2's。
附上原文。
在換行符上進行模式匹配,并用修改后的行中的第 3 列替換原始中的第 3 列。
uj5u.com熱心網友回復:
還有awk:
awk 'NR > 1 {s=$3;sub(/1/,"2",s);sub(/0/,"1",s);$3=s} 1' file
1 RQ22067-0 -9
2 RQ34365-4 2
3 RQ34616-4 2
4 RQ34720-1 1
5 RQ14799-8 1
6 RQ14754-1 1
7 RQ22101-7 1
8 RQ22073-1 1
9 RQ30201-1 1
sub()在 的副本上進行替換$3,然后將帶有更改的副本分配給 $3。
uj5u.com熱心網友回復:
當你不喜歡簡單的
sed 's/1$/2/; s/0$/1/' file
你可能想玩
sed -E 's/(.*)([01])$/echo "\1$((\2 1))"/e' file
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/327239.html
上一篇:使用awk增加特定字符
