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只需捕获倒数第二个目录即可轻松使用:

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

编辑:如果它并不总是倒数第二个目录:

$ grep "^FILE_PATHS" file | egrep -o "(MOTHER|BROTHER|AUNT|FATHER)"
MOTHER
BROTHER
AUNT
FATHER
于 2013-01-25T14:11:19.720 回答
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

再次编辑

如果第三个字段的值是 SIB 或 REL 我想打印第五个字段中的任何内容

我会说它应该是第 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 回答
0

这假设您没有任何大写字母,除了您要查找的单词:

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