从文件中获取文件列表并打印具有条件的行的特定部分

时间:2013-01-25 13:55:12

标签: linux bash sed awk grep

我想从“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来说是全新的,有没有更好的方法我没有看到?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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,我想打印   第五个领域的任何内容

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

答案 2 :(得分:0)

这假设您没有任何大写字母,除了您正在寻找的字词:

sed '/^FILE_PATHS/!d; s/^FILE_PATHS//; s/[^A-Z]//g; s/^SIB\|REL//' filename