从行尾提取子字符串

时间:2014-03-26 17:32:52

标签: bash

我有一个很长的文件名列表,从每个文件名中我想从后面提取第4个标记所标识的子字符串,假设分隔符是下划线,如:

/dir1/_GET_na_na_na.txt
/dir1/dir2/_GET_na_na_na.txt
/dir1/dir2/na_GET_na_na_na.txt
/dir1/dir2/na_na_GET_na_na_na.txt

在所有这些情况下,我想提取“下划线GET下划线”。我可以'basename'来摆脱随机的dirname,但这仍然无法解决我需要从后面'切割-f4 -d_'的问题。

4 个答案:

答案 0 :(得分:2)

这是awk的工作

awk -F_ 'NF > 3 {print FS $(NF-3) FS}' file.txt

答案 1 :(得分:2)

正如其他答案所给出的那样,基于awk的解决方案可能是最快/最简单的。但是,由于你只是标记,这里只是一个bash答案:

$ while IFS=_ read -a line; do echo "_${line[@]: -4:1}_"; done < file.txt
_GET_
_GET_
_GET_
_GET_
$ 

只需将每一行读入一个数组,然后在_上拆分。然后从最后一个数组元素输出第4个。

答案 2 :(得分:1)

又脏又快:

awk -F'_' '{NF-=3;print FS $NF FS}' file

包含您的数据:

kent$  echo "    /dir1/_GET_na_na_na.txt
    /dir1/dir2/_GET_na_na_na.txt
    /dir1/dir2/na_GET_na_na_na.txt
    /dir1/dir2/na_na_GET_na_na_na.txt"|awk -F'_' '{NF-=3;print FS $NF FS}'
_GET_
_GET_
_GET_
_GET_

答案 3 :(得分:1)

以下是perl中的一个:

$  perl -F_ -lane '$,="_"; print "",$F[-4],""' file.txt
_GET_
_GET_
_GET_
_GET_
相关问题