我有一个包含产品名称的文件,其中名称之间包含特殊字符和空格。最后有该产品的代码。
在 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
注意事项
正如@他们在评论中提到的,有一些注意事项需要注意:
- 来自评论:
请注意,使用
file2
as 模式 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.)
- 正如@他们所写:
另请注意,默认情况下不锚定正则表达式,这意味着以 . 开头的行
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 '[^ ]*$'