6

私はこのようなデータのセットを持っています

col1    col2    col3    col4
ABC1    DEF1    GHI1    cond1
ABC2    DEF2    GHI2    cond1-cond2
ABC3    DEF3    GHI3    cond2/cond1
ABC4    DEF4    GHI4    cond2 cond1
ABC5    DEF5    GHI5    cond4/cond1
ABC6    DEF6    GHI6    cond1
ABC7    DEF7    GHI7    mcond1
ABC8    DEF8    GHI8    cond2
ABC9    DEF9    GHI9    cond1 at 50
ABCa    DEFa    GHIa    con cond1
ABCb    DEFb    GHIb    no. cond1
ABCc    DEFc    GHIc    cond1 something
ABCc    DEFc    GHIc    Mcond1

「col4」に従ってデータを分離するためのコマンドをいくつか記述して取得しようとしています。

  1. 文字列「cond1」の前後に「M」と「m」以外の文字列が含まれるファイル。私は現在、このコマンドを使用しています (明らかに、M と m を除外していません)。

    awk 'BEGIN{IGNORECASE=1} $4 ~ /.cond1/ || $4 ~ /cond1./ ' /filepath.tab
    

    また、データの 4 行目、9 行目、11 行目に「cond1」と他の文字列の間にスペースが含まれていることに注意してください。これをファイルに含めたいと思います。(コマンドの「.」にはスペースが含まれていますか?)

  2. 「col4」にのみ「cond1」を含むファイルを取得するコマンドを作成しました

    awk 'BEGIN{IGNORECASE=1} $4 ~ /^cond1$/ '  /filepath.tab
    

    ほとんどのデータで問題なく動作していますが、結果に次の 2 つのバグがあります。

    ABC9    DEF9    GHI9    cond1 at 50
    ABCc    DEFc    GHIc    cond1 something
    

誰でもこれら2つのコマンドで私を助けてもらえますか? ありがとう。

重複を含まない 3 つのファイルの出力を探しています。例を次に示します: File1 (cond1 とのすべての組み合わせを含む):

col1    col2    col3    col4
ABC2    DEF2    GHI2    cond1-cond2
ABC3    DEF3    GHI3    cond2/cond1
ABC4    DEF4    GHI4    cond2 cond1
ABC5    DEF5    GHI5    cond4/cond1
ABC9    DEF9    GHI9    cond1 at 50
ABCa    DEFa    GHIa    con cond1
ABCb    DEFb    GHIb    no. cond1
ABCc    DEFc    GHIc    cond1 something

File2 (cond1 のみを含む):

col1    col2    col3    col4
ABC1    DEF1    GHI1    cond1
ABC6    DEF6    GHI6    cond1

ファイル 3 (ファイル 1 とファイル 2 に含まれていないものをすべて含む):

col1    col2    col3    col4
ABC7    DEF7    GHI7    mcond1
ABC8    DEF8    GHI8    cond2
ABCc    DEFc    GHIc    Mcond1

3つのファイルの合計行は元のファイルと同じであることに注意してください。これがかなり複雑に聞こえる場合は申し訳ありませんが、これは私が実際に持っている場合です。

4

3 に答える 3

2

問題は、列 4 にスペースがあり、ファイルが期待どおりにフォーマットされてawk -F'\t' {print $4} fileいないことです。

最初にファイルをCSV形式に変換しますsed

$ sed 's/\s\+/,/;s/\s\+/,/;s/\s\+/,/;' file
col1,col2,col3,col4
ABC1,DEF1,GHI1,cond1
ABC2,DEF2,GHI2,cond1-cond2
ABC3,DEF3,GHI3,cond2/cond1
ABC4,DEF4,GHI4,cond2 cond1
ABC5,DEF5,GHI5,cond4/cond1
ABC6,DEF6,GHI6,cond1
ABC7,DEF7,GHI7,mcond1
ABC8,DEF8,GHI8,cond2
ABC9,DEF9,GHI9,cond1 at 50
ABCa,DEFa,GHIa,con cond1
ABCb,DEFb,GHIb,no. cond1
ABCc,DEFc,GHIc,cond1 something
ABCc,DEFc,GHIc,Mcond1

これは、最初の 3 つの空白グループのみをコンマに変換し、必要に応じて col4 を残します。変更をファイルに保存するには、次の-iオプションを使用します。

sed -i 's/\s\+/,/;s/\s\+/,/;s/\s\+/,/;' file

これで、フィールド セパレータ,が使用できるようになりました。

awk 'BEGIN{FS=",";OFS="\t"} NR==1{print $1,$2,$3,$4} $4~/cond1./|| $4~/[^mM]cond1/{print $1,$2,$3,$4}' file
col1    col2    col3    col4
ABC2    DEF2    GHI2    cond1-cond2
ABC3    DEF3    GHI3    cond2/cond1
ABC4    DEF4    GHI4    cond2 cond1
ABC5    DEF5    GHI5    cond4/cond1
ABC9    DEF9    GHI9    cond1 at 50
ABCa    DEFa    GHIa    con cond1
ABCb    DEFb    GHIb    no. cond1
ABCc    DEFc    GHIc    cond1 something

$ awk 'BEGIN{FS=",";OFS="\t"} NR==1{print $1,$2,$3,$4} $4~/^cond1$/{print $1,$2,$3,$4}' file 
col1    col2    col3    col4
ABC1    DEF1    GHI1    cond1
ABC6    DEF6    GHI6    cond1

$ awk 'BEGIN{FS=",";OFS="\t"} $4!~/cond1/ || $4~/[Mm]cond1/{print $1,$2,$3,$4}' file
col1    col2    col3    col4
ABC7    DEF7    GHI7    mcond1
ABC8    DEF8    GHI8    cond2
ABCc    DEFc    GHIc    Mcond1

リダイレクトして newfiles を保存するだけawk '{...}' > file1です。

于 2013-01-04T10:49:16.087 に答える
1

フィールドはタブで区切られているため、ブロックで使用FS="\t"BEGINます。また、あなたの状態は適切ではありません。だから私はそれを変更しました。

awk 'BEGIN{IGNORECASE=1; FS="\t"; } $4 ~ /cond1/ && $4 !~ /mcond1|cond1m/' data
于 2013-01-04T10:38:51.267 に答える
1

1 回のパスでタスクを達成できます。次のように実行します。

awk -f script.awk file

の内容script.awk:

BEGIN {
    FS="\t"
}

NR==1 {
    r=$0
    next
}

{
    i = ($4 == "cond1" ? 2 : ($4 ~ /cond1/ && $4 !~ /[Mm]cond1/ ? 1 : 3))
    print (!a[i]++ ? r ORS : "") $0 > "file" i ".txt"
}

の結果grep . file[1-3].txt:

file1.txt:col1  col2    col3    col4
file1.txt:ABC2  DEF2    GHI2    cond1-cond2
file1.txt:ABC3  DEF3    GHI3    cond2/cond1
file1.txt:ABC4  DEF4    GHI4    cond2 cond1
file1.txt:ABC5  DEF5    GHI5    cond4/cond1
file1.txt:ABC9  DEF9    GHI9    cond1 at 50
file1.txt:ABCa  DEFa    GHIa    con cond1
file1.txt:ABCb  DEFb    GHIb    no. cond1
file1.txt:ABCc  DEFc    GHIc    cond1 something
file2.txt:col1  col2    col3    col4
file2.txt:ABC1  DEF1    GHI1    cond1
file2.txt:ABC6  DEF6    GHI6    cond1
file3.txt:col1  col2    col3    col4
file3.txt:ABC7  DEF7    GHI7    mcond1
file3.txt:ABC8  DEF8    GHI8    cond2
file3.txt:ABCc  DEFc    GHIc    Mcond1

または、ここにワンライナーがあります:

awk -F "\t" 'NR==1 { r=$0; next } { i = ($4 == "cond1" ? 2 : ($4 ~ /cond1/ && $4 !~ /[Mm]cond1/ ? 1 : 3)); print (!a[i]++ ? r ORS : "") $0 > "file" i ".txt" }' file
于 2013-01-05T04:45:31.617 に答える