私はしようとしています
入力は、以下の「final_pcs_mod_test.csv」という名前のようになります。
PC_00001,143,143.0,Eury_gr2_(111),Eury_gr5_(19),Unk_unclust_(1),Eury_gr1_(6),MAV_eury_(6)
PC_00004,137,137.0,Eury_gr6_(20),Eury_gr11_(24),Eury_gr14_(24),Eury_gr8_(8),Eury_gr12_(13)
PC_00027,109,109.0,Eury_gr1_(80),MAV_eury_(8)
目的の出力は、以下の「eury1」という名前のようになります。
PC_00001,143,143.0,Eury_gr1_(6)
PC_00004,137,137.0,0
PC_00027,109,109.0,Eury_gr1_(80)
私が使用しているコマンドは次のとおりです。
awk 'BEGIN {FS=","};{for(i=4;i<=NF;i++){if($i~/^Eury_gr1_/){a=$i} else {a="0"}} print $1,$2,$3,a}' final_pcs_mod_test.csv > eury1
実際の出力は次のとおりです。
PC_00001,143,143.0,0
PC_00004,137,137.0,0
PC_00027,109,109.0,Eury_gr1_(80)
ご覧のとおり、最初の行には「Eury_gr1_」エントリがありません。コードは最初に指定された列のみを検索しており、必要に応じてすべての列を検索していないようです。私はfor(i=4;i<=4;i++)
などをいじっています...しかし、これまでのところ、入力の最後の列のエントリを見つけることができないようです。入力ファイル全体には、最大17列があります。私は何が間違っているのですか?
GNUで示されたサンプルをフォローし、記述し、テストしてみてくださいawk
。出力は、示されているサンプルと同じになります。
awk '
BEGIN{
FS=OFS=","
}
{
for(i=4;i<=NF;i++){
if($i~/Eury_gr1_\([0-9]+\)/){
found=(found?found OFS:"")$i
}
}
if(found==""){ $4="0" }
else { $4=found }
print $1,$2,$3,$4
found=""
}' Input_file
または
awk '
BEGIN{
FS=OFS=","
}
{
for(i=1;i<=NF;i++){
if(i<=3){
val1=(val1?val1 OFS:"")$i
}
else if(i>3){
if($i~/Eury_gr1_\([0-9]+\)/){
found=(found?found OFS:"")$i
}
}
}
if(found==""){ $4="0" }
else { $4=found }
print val1,$4
found=val1=""
}' Input_file
説明:上記の詳細な説明を追加します。
awk ' ##Starting awk program from here.
BEGIN{ ##Starting BEGIN section from here of this program.
FS=OFS="," ##Setting field separator and output field separator to comma here.
}
{
for(i=1;i<=NF;i++){ ##Traversing through all the fields of current line here.
if(i<=3){ ##Checking condition if field number of lesser than or equal to 3 then do following.
val1=(val1?val1 OFS:"")$i ##Creating val1 and keep adding values there.
}
else if(i>3){ ##else if field number is greater than 3 then do following.
if($i~/Eury_gr1_\([0-9]+\)/){ ##Checking if current field is Eury_gr1_(digits) then do following.
found=(found?found OFS:"")$i ##Creating variable found and keep adding values there.
}
}
}
if(found==""){ $4="0" } ##Checking condition if found is NULL then make 4th field as zero.
else { $4=found } ##else set found value to 4th field here.
print val1,$4 ##Printing val1 and 4th field here.
found=val1="" ##Nullifying val1 and found here.
}' Input_file ##Mentioning Input_file name here.
OPの試みの修正: OPのコメントに従って、ここでOPの試みを修正します。ただし、これはEury_gr1
各行の1つのオカレンスにのみ一致します。すべてのオカレンスを探すには、上記のソリューションを参照してください。
awk '
BEGIN{
FS=","
}
{
for(i=4;i<=NF;i++){
if($i~/^Eury_gr1_\([0-9]+\)$/){ a1 }
}
print $1,$2,$3,a1
a1=""
}' Input_file
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加