0

「FILE_PATHS」の後にファイル内にリストされているさまざまなディレクトリからファイルパスを抽出し、条件に基づいてこれらのファイル名の特定の部分を抽出したいと思います。例えば:

$ grep ^FILE_PATHS file.txt
FILE_PATHS /james/families/MOTHER/analyses/trait 
FILE_PATHS /james/families/SIB/analyses/BROTHER/trait 
FILE_PATHS /james/families/REL/analyses/AUNT/trait 
FILE_PATHS /james/families/FATHER/analyses/trait 

このファイルパスのリストから、ファイル名「MOTHER」、「SIB」、「REL」、「FATHER」の特定の部分を抽出し、この部分が「SIB」と等しい場合は「BROTHER」を出力します。 、「REL」と等しい場合は「AUNT」を出力し、そうでない場合(「MOTHER」および「FATHER」の場合)は「MOTHER」および「FATHER」を出力します。パスが他のファイルと異なるファイルは、4番目のフィールドの「SIB」と「REL」に等しいファイルだけですが、複雑なのは、6番目のフィールドの値に多くのオプションがあるためです。 6番目のフィールドに「BROTHER」と「AUNT」の値を指定する必要がないソリューションを探していますが、それでは6番目のフィールドが出力されます。

したがって、次のようになります。

cat file.txt | while read line; do
if [ `echo "$line" | grep ^FILE_PATHS file.txt | cut -d' ' -f 2 | cut -d '/' -f4 -eq "BROTHER" | "REL" `  ]

then
    grep ^FILE_PATHS file.txt | cut -d' ' -f 2 | cut -d '/' -f5
else
    grep ^FILE_PATHS file.txt | cut -d' ' -f 2 | cut -d '/' -f4
fi; done

これはエラーでいっぱいで間違っていますが、おそらく私は間違ったアプローチを一緒に持っています、そしてこれを行うための賢い方法があると確信していますが、私はBASHにまったく慣れていません、私が見ないより良いアプローチはありますか?

4

3 に答える 3

1

sed最後から 2 番目のディレクトリをキャプチャするだけで簡単に使用できます。

$ sed -r '/^FILE_PATHS/s#.*/(\w+)/.*#\1#' file
MOTHER
BROTHER
AUNT
FATHER

編集:常に最後から2番目のディレクトリではない場合:

$ grep "^FILE_PATHS" file | egrep -o "(MOTHER|BROTHER|AUNT|FATHER)"
MOTHER
BROTHER
AUNT
FATHER
于 2013-01-25T14:11:19.720 に答える
0

これは、探している単語以外に大文字がないことを前提としています。

sed '/^FILE_PATHS/!d; s/^FILE_PATHS//; s/[^A-Z]//g; s/^SIB\|REL//' filename
于 2013-01-25T17:08:15.950 に答える
0

これはあなたのために働くはずです

your grep....|awk -F/ '{$4=$4=="REL"?"AUNT":$4;$4=$4=="SIB"?"BROTHER":$4;print $4}'

実際には、次のように grep を awk に組み合わせることができます。

awk -F/ '/^FILE_PATHS/{$4=$4=="REL"?"AUNT":$4;$4=$4=="SIB"?"BROTHER":$4;print $4}' file.txt

あなたの例からの出力:

MOTHER
BROTHER
AUNT
FATHER

それがどのように機能するかを示します:

kent$  cat o
FILE_PATHS /james/families/MOTHER/analyses/trait 
FILE_PATHS /james/families/SIB/analyses/BROTHER/trait 
FILE_PATHS /james/families/REL/analyses/AUNT/trait 
FILE_PATHS /james/families/FATHER/analyses/trait

kent$  awk -F/ '/^FILE_PATHS/{$4=$4=="REL"?"AUNT":$4;$4=$4=="SIB"?"BROTHER":$4;print $4}'  o
MOTHER
BROTHER
AUNT
FATHER

もう一度編集

3 番目のフィールドの値が SIB または REL の場合、5 番目のフィールドにあるものを出力したいと思います。

4 番目のフィールドが SIB/REL であるべきだと思います。次に 6 番目を出力します。最初のフィールドは FILE_PATHS であるためです。

今、この行は機能します:

  awk -F/ '/^FILE_PATHS/{$4=$4~"^(REL|SIB)$"?$6:$4;print $4}' file.txt

テスト!!:

kent$  cat o
FILE_PATHS /james/families/MOTHER/analyses/trait 
FILE_PATHS /james/families/SIB/analyses/BROTHER/trait 
FILE_PATHS /james/families/REL/analyses/AUNT/trait 
FILE_PATHS /james/families/FATHER/analyses/trait

kent$  awk -F/ '/^FILE_PATHS/{$4=$4~"^(REL|SIB)$"?$6:$4;print $4}' o
MOTHER
BROTHER
AUNT
FATHER
于 2013-01-25T13:58:47.387 に答える