0

我在使用 awk 时遇到问题。实际上我有两种类型的文件。以下是文件的包含。

文件 1

x|y|z|a|b|c
x|y|z|a|b|c
x|y|z|a|b|c

文件2

"x"|"y"|"z"|"a"|"b"|"c"
"x"|"y"|"z"|"a"|"b"|"c"
"x"|"y"|"z"|"a"|"b"|"c"

我必须使用 awk 从第二列中搜索一些值。但问题是 file1 有不带引号的记录,而 file2 有带双引号的记录。我需要创建一个逻辑来搜索第二列中的值。

任何人都可以帮忙吗?

4

3 回答 3

1

我注意到没有必要清理文件。要在两个文件中查找值y,您可以执行以下操作:

$ awk -F"|" '$2~/y/' file1 file2
x|y|z|a|b|c
x|y|z|a|b|c
x|y|z|a|b|c
"x"|"y"|"z"|"a"|"b"|"c"
"x"|"y"|"z"|"a"|"b"|"c"
"x"|"y"|"z"|"a"|"b"|"c"

使用更复杂的输入:

$ cat file1
x|y|z|a|b|c
x|T|z|a|b|c
x|aa|y|a|b|c
$ cat file2
"x"|"y"|"z"|"a"|"b"|"c"
"x"|"22"|"z"|"a"|"b"|"c"
"x"|"t"|"y"|"a"|"b"|"c"

我们得到:

$ awk -F"|" '$2~/y/' file1 file2
x|y|z|a|b|c
"x"|"y"|"z"|"a"|"b"|"c"
于 2013-07-10T13:25:12.307 回答
1

我希望您发布了一些示例输入(不仅仅是带有 x/y 占位符的格式,而是实际数据)和预期输出,以便我们可以测试我们的解决方案,但这应该做您想要的:

awk -F'"?[|]"?' '$2 == whatever' file

将“whatever”替换为您要查找的任何内容,如果您想要 RE 比较而不是精确比较,则将 == 替换为 ~。

如果您也必须能够查看第一个和最后一个字段,那么有多种解决方案,“最佳”解决方案将由您的真实数据决定,但如果您在“任何”中没有不受欢迎的 RE 元字符,这是一种方法:

awk -F'"?[|]"?' ' $1 ~ "^\"?" whatever    "$"' file
awk -F'"?[|]"?' '$NF ~ "^"    whatever "\"?$"' file
于 2013-07-10T14:09:44.263 回答
0

只需过滤掉引号sed 's/\"//g'并将它们通过管道传递给 awk|

$ sed 's/\"//g' file2
x|y|z|a|b|c
x|y|z|a|b|c
x|y|z|a|b|c

您的最终结果将类似于

$ sed 's/\"//g' file2 | awk <magic goes here...>
于 2013-07-10T13:21:15.703 回答