我需要 grep file1 和 file2 中的代码并将其写入 file3

我需要 grep file1 和 file2 中的代码并将其写入 file3

我有一个包含产品名称的文件,其中名称之间包含特殊字符和空格。最后有该产品的代码。

在 file2 中,我只有产品名称,没有代码。

我需要一个命令来查看文件内部并搜索产品名称并从该产品名称中获取代码并将其写入 file3。

我想要做的示例图像是这里

例子

你能帮我一个正确的命令吗?

答案1

来自grep手册:

-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. (-f is specified by POSIX .

因此,以下命令将在 file1 中查找 file2 中的匹配行。

grep -f file2 file1

然后,您只需从第一个命令的输出中获取最后一个字段。

grep -f file2 file1 | awk '{ print $NF }' > file3

注意事项

正如@他们在评论中提到的,有一些注意事项需要注意:

  1. 来自评论:

请注意,使用file2as 模式 withgrep会将其中的文本视为正则表达式。这意味着某些字符(例如.*)可能会意外匹配。

例如,如果file2包含行This is a dot.,它也可能This is a dotx匹配file1

为了解决这个问题,您可以使用添加标志-F/--fixed-strings将模式中的所有字符视为文字:

-F, --fixed-strings
       Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F  is specified by POSIX.)
  1. 正如@他们所写:

另请注意,默认情况下不锚定正则表达式,这意味着以 . 开头的行MM706也将匹配以 QMM706.

某种解决方法可能是使用该-w/--word-regexp标志:

-w, --word-regexp
       Select  only  those  lines  containing  matches  that form whole  
       words.  The test is that the matching substring must  either  be
       at  the  beginning  of  the  line,  or  preceded  by  a non-word
       constituent character.  Similarly, it must be either at the  end
       of  the  line  or  followed by a non-word constituent character.
       Word-constituent  characters  are  letters,  digits,   and   the
       underscore.

它仅部分解决了问题,QMM706因为MM706.但是,它仍然不能确保仅匹配出现在行开头的模式。

两者都可以-F,也-w可以结合起来-f达到预期的结果。

答案2

您似乎想从每行中获取最后一个以空格分隔的字段。

awk '{ print $NF }' file.txt

默认情况下,awk将每个输入行拆分为空格和制表符上的字段(这些空白字符中的一个或多个空白字符将两个字段彼此分隔开)。由此产生的字段数存储在特殊变量中NF。可以使用 访问最后一个字段$NF


假设您file2.txt只包含产品的子集,并且您只想从中获取file.txt该子集的产品代码,并且假设最后一个字段中的数字file2.txt对于该产品是唯一的,您可以使用

awk 'NR == FNR { nr[$NF] = 1; next } ($(NF-1) in nr) { print $NF }' file2.txt file.txt

这会将 末尾的数字作为键读取file2.txt到数组中。nr然后,它将每行倒数第二个字段中的数字与file.txt存储的数字进行比较,nr如果该数字作为数组中的键存在,则打印最后一个字段。

这显然未经测试,因为我不会坐下来写下图像中的数据。

答案3

也试试

grep -f file2 file1 | grep -o '[^ ]*$'

相关内容