【问题标题】:AWK how to read a line from file and get some value using substringAWK如何从文件中读取一行并使用子字符串获取一些值
【发布时间】:2012-12-12 05:11:29
【问题描述】:

我是 AWK 的新手。 你能告诉我如何使用awk从文件中读取一行吗?如何使用读取行中的子字符串函数获取值并将其存储到变量中?例如这里是数据集:

01 001   410070300186169                 359829047319420
01 002   410070234186169                 359829043245420
01 001   410070234186169                 359829047319420

我想检查位置 4 到 6 的值是否为“001”,然后将数据写入文件 file_1,如果值为“002”,则将数据写入文件 file_2。

【问题讨论】:

  • 对于模糊的问题,我们最多只能给出模糊的答案。你能提供至少具体的例子吗?
  • 感谢您的宝贵意见。将示例数据添加到问题中。

标签: shell unix awk


【解决方案1】:

给你;您可以将所有内容放在一行中,但为了便于阅读,我将其分解为多个:

awk '$2=="001" {print > "file_1"}
     $2=="002" {print > "file_2"}' input_file

说明:

  • awk 默认情况下使用空格和制表符作为分隔符将每一行分隔为字段,因此对于读取的每一行,第二列中的值将保存在 $2
  • $2=="001" {print > "file_1"}:如果$2001,则将整行打印到file_1
  • $2=="002" {print > "file_2"}:同样适用于002

【讨论】:

  • 感谢您的回复和解释。
  • 亲爱的 Sanoson,如果我必须将 $2 的值与其他或数据库中包含的某些列表进行比较,那么该怎么办?
【解决方案2】:

您可以像这样在 awk 1 班轮中完成所有这些操作:

awk '$2 == "001" {print > "file_1"} $2 == "002" {print > "file_2"}' infile

【讨论】:

  • 感谢阿努的回复。但是您的代码并不关心特定的位置。喜欢从位置 4 到 6
  • @QMG 您看到的错误是什么?他的解决方案基于您在示例中指定的输入格式。
  • @QMG 以这种方式使用单独的字段比较输入数据要好得多,而不是从位置 4 到 6 的子字符串,如果有人在第二个字段之前放置一个额外的空格,这是非常不可靠的。
  • 感谢阿努的帮助。
【解决方案3】:

你可以读入 $0

getline <file

那么你可以使用

 substr($0, 1 , 5)

获取从索引 1 开始,长度为 5 的 $0 子字符串

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2013-04-28
    • 2023-04-06
    相关资源
    最近更新 更多