提取文本文件中特定列的一部分

提取文本文件中特定列的一部分
ffmj0010.09o:FFMJ                                                  MARKER NAME
ffmj0020.09o:BRMU                                                  MARKER NAME

在这个文本文件中(2 行,行间无空格),我需要提取“:”后面的 4 个字符(“FFMJ”、“BRMU”)并将它们保存在另一个文本文件中。我需要使用哪个命令?

答案1

使用sed

sed 's/.*:\(.\{4\}\).*/\1/' in > out
  • s:断言执行替换
  • /:停止命令/启动模式
  • .*:: 匹配任意数量的任意字符,直到最后一个:字符和一个:字符
  • \(.\{4\}\):匹配并分组任意字符的 4 次出现
  • .*: 匹配任意数量的任意字符
  • /:停止模式/开始替换字符串
  • \1:反向引用被替换为第一个捕获组
  • /:停止替换字符串/启动模式标志

示例文件的示例输出:

% cat in
ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME
% sed 's/.*:\(.\{4\}\).*/\1/' in > out
% cat out
FFMJ
BRMU

答案2

使用awk和多个分隔符

awk -F'[: ]' '{print $2}' in > out

例子

$ cat in
ffmj0010.09o:FFMJ                                                  MARKER NAME
ffmj0020.09o:BRMU                                                  MARKER NAME

$ awk -F'[: ]' '{print $2}' in 
FFMJ
BRMU

答案3

如果你确定你想要在行尾前恰好有 4 个字符,你可以执行以下操作:

grep -Eo '.{4}$' file.txt >out.txt

否则,您可以使用grepPCRE 获取直到:行尾的所有字符:

grep -Po '.*:\K[^:]+$' file.txt >out.txt

您还可以使用bash参数扩展:

while IFS= read -r line; do echo "${line##*:}"; done <file.txt >out.txt

编辑:

正如 @kos 指出的那样,我可能误解了这个问题,如果您想要正好 4 个字符,:您可以这样做:

grep -Po '.*:\K.{4}' file.txt >out.txt

答案4

使用grep

cat oldFile | grep -o ":[A-Z]*" | grep -o "[A-Z]*" > newFile
cat oldFile |                                         # Read the file
               grep 
                    -o                                # Only give the greped data
                       ":[A-Z]*"                      # Find a : followed by 4
                                                      #  4 capital letters
                                 | grep -o "[A-Z]*"   # Remove the : from that

然后> newFile输出到文件。

举个例子:

ffmj0010.09o:FFMJ MARKER NAME
ffmj0020.09o:BRMU MARKER NAME

FFMJ
BRMU

相关内容