我有一个很长的文件名列表,从每个文件名中我想从后面提取第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_'的问题。
答案 0 :(得分:2)
这是awk的工作
awk -F_ 'NF > 3 {print FS $(NF-3) FS}' file.txt
答案 1 :(得分:2)
正如其他答案所给出的那样,基于awk
的解决方案可能是最快/最简单的。但是,由于你只是标记bash,这里只是一个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_