【问题标题】:How to read nth line and mth field of text file in unix如何在unix中读取文本文件的第n行和第m个字段
【发布时间】:2018-11-16 21:37:38
【问题描述】:

假设我有 |分隔文件,

Line1:    1|2|3|4
Line2:    5|6|7|8
Line3:    9|9|1|0

现在我需要在第二行读取 3 个字段,即上面示例中的 7,我如何使用 Cut 或 Sed 命令来做到这一点。我是unix新手,请帮忙

【问题讨论】:

  • 你可以使用 awk 来实现
  • 您需要按顺序读取文件。也许你想使用一些数据库,例如sqlite 而不是
  • 您也可以将sedcut 一起使用,但您需要阅读sed(1)cut(1) 的文档
  • sed -n '2p' file.txt | cut -d'|' -f 3
  • sed '2!d' file.txt | cut -d'|' -f 3

标签: unix sed cut


【解决方案1】:

awk 的工作:

awk -F '|' 'NR==2{print $3}' file

awk -F '|' -v row=2 -v col=3 'NR==row{print $col}' file

输出:

7

【讨论】:

    【解决方案2】:

    这应该可行:

    sed -n '2p' file |awk -F '|' '{print $3}'

    【讨论】:

      【解决方案3】:

      这可能对你有用(GNU sed):

      sed -rn '2s/^(([^|]*)\|?){3}.*/\2/p' file
      

      通过设置-n 选项关闭自动打印,通过-r 选项打开更简单的正则表达式声明。使用模式匹配和反向引用将整个第二行替换为同一行的第三个字段并打印结果。

      替换命令的地址仅限于第二行。

      正则表达式将非定界字符分组,后跟一个定界符特定次数。第二组,仅保留特定数字的非分隔字符。每个分组都被下一个替换,因此会报告最后一个分组,.* 会占用该行的其余部分,因此仅打印第三个字段(第二组的内容)。

      注意定界符将出现在最后一列之后,因此是可选的\|?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-01
        • 1970-01-01
        • 2018-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        相关资源
        最近更新 更多