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