我正在使用 GWAS 資料,我的資料如下所示:
IID,kgp11004425,rs11274005,kgp183005,rs746410036,kgp7979600
1,00,AG,GT,AK,00
32,AG,GG,AA,00,AT
100,TT,AA,00,AG,AA
3,GG,AG,00,GT,GG
期望的輸出:
IID,kgp11004425,rs11274005,kgp183005,rs746410036,kgp7979600
1,N/A,AG,GT,AK,N/A
32,AG,GG,AA,N/A,AT
100,TT,AA,N/A,AG,AA
3,GG,AG,N/A,GT,GG
在這里,我試圖用“N/A”替換“00”,但由于我在第一行和第一列(IID)中有 00,所以我使用的命令:
sed '1!s~00~N/A~g' allSNIPsFinaldata.csv
上述命令排除了第一行但不排除第一列,因此我得到 IID 值 100、200 和 300 作為 1N/A、2N/A 和 3N/A。任何人都可以請幫助“如何排除第一行和第一列并執行上述操作。請幫助
uj5u.com熱心網友回復:
awk使用您在 GNU中使用其功能顯示的示例gensub,請嘗試以下awk程式。
awk '
BEGIN{
FS=OFS=","
}
FNR==1{
print
next
}
{
secondPart=gensub(/^[^,]*,(.*)/,"\\1","g")
sub(/^00,/,"N/A,",secondPart)
gsub(/,00,/,",N/A,",secondPart)
sub(/,00$/,",N/A",secondPart)
print $1 OFS secondPart
}
' Input_file
uj5u.com熱心網友回復:
假設列由空格或制表符等字符分隔,space請嘗試:
sed -E '1!s~([[:space:]])00([[:space:]]|$)~\1N/A\2~g' allSNIPsFinaldata.csv
- 地址
1!跳過第一行。 - 正則運算式
([[:space:]])00([[:space:]]|$)匹配00前面有空格字符(它防止匹配第一列)并后跟空格字符或行尾的字串。
uj5u.com熱心網友回復:
一個awk:
$ awk '
BEGIN {
FS=OFS="," # set field delimiters to a comma
}
FNR>1 { # process records after the first
for(i=1;i<=NF;i ) # iterate all fields (maybe start from 2nd?)
if($i=="00") # if field is 00
$i="N/A" # replace
}1' file # output
輸出:
IID,kgp11004425,rs11274005,kgp183005,rs746410036,kgp7979600
1,N/A,AG,GT,AK,N/A
32,AG,GG,AA,N/A,AT
100,TT,AA,N/A,AG,AA
3,GG,AG,N/A,GT,GG
uj5u.com熱心網友回復:
如果您只想替換其他列中的 00 ,則必須在您的模式中添加一個分隔符(我假設我的命令中有空格):
sed -i 's~ 00 ~ N/A ~g' allSNIPsFinaldata.csv
uj5u.com熱心網友回復:
這可能對您有用(GNU sed):
sed -E '1!{s/,00(,|$)/,N\/A\1/g;s//,N\/A\1/g}' file
如果不是首行且,后跟是00后跟,或行尾,替換00byN/A和其他部分的匹配保持不變。
這種替換是全域的,但需要執行兩次,因為模式可能重疊。
uj5u.com熱心網友回復:
在每個 Unix 機器上的任何 shell 中使用任何 awk:
$ awk '{$0=$0","; gsub(/,00,/,",N/A,"); sub(/,$/,"")} 1' file
IID,kgp11004425,rs11274005,kgp183005,rs746410036,kgp7979600
1,N/A,AG,GT,AK,N/A
32,AG,GG,AA,N/A,AT
100,TT,AA,N/A,AG,AA
3,GG,AG,N/A,GT,GG
以上假設第一行的列名都不是確切的字串00。如果可以,那么只需將上述調整為:
awk 'NR>1{$0=$0","; gsub(/,00,/,",N/A,"); sub(/,$/,"")} 1' file
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467887.html
