【问题标题】:Who to get/copy a specific word from a text file using bash?谁使用 bash 从文本文件中获取/复制特定单词?
【发布时间】:2014-01-09 19:49:17
【问题描述】:

当我这样做时:

LINE=$(head -38 fine.txt | tail -1 | cut -f2)

我得到文件的第38行,即:

Xres  = 1098

但我只需要记录 1098 作为变量的值。

我正在训练读取文本文件并记录值并将它们用作稍后在我的脚本中的参数。

【问题讨论】:

  • 第 38 行的全部内容是什么?
  • LINE=$(head -38 fine.txt | tail -1) 是什么样的? cut 是做什么用的?你可以通过稍微调整cut 的参数来得到你想要的。
  • 请考虑将其中一个答案标记为已接受。在您这样做之前,这个问题将继续显示为未解决。谢谢。

标签: bash terminal


【解决方案1】:

| awk '{print $3}' 添加到管道中。

【讨论】:

    【解决方案2】:
    sed -n '38s/.*= *//p' fine.txt
    

    默认情况下,sed 打印每个输入行。 -n 选项禁用此行为。 38 选择第 38 行,当看到这一行时,替换将直到最后一个等号的所有内容替换为空,然后打印。

    假设第二个字段是最后一个字段。如果输入行比我想象的更复杂,请尝试替换 s/^[^\t]*\t[^\t]*= *//p。如果您的 sed 无法将 \t 识别为制表符,则需要提供文字制表符(您可以在某些 shell 中使用键序列 ctrl-v 制表符输入一个)。

    如果输入文件很大,您可能需要重构 sed 脚本以在第 38 行之后退出。

    结束,这让我们明白了

    LINE=$(sed -n '38!b;s/^[^\t]*\t[^\t]*= *//p;q' fine.txt)
    

    但是,这变得有些复杂,以至于妨碍了易读性和可维护性。在 awk 中同样的可读性更强;

    awk -F '\t' 'NR==38 { sub(/.*= */,"",$2); print $2; exit 0 }' fine.txt
    

    更一般地说,您可能希望先按制表符拆分,然后按空格拆分。以下更精确地实现了cut -f2 | awk '{ print $3 }'

    awk -F '\t' 'NR==38 { split($2,f); print f[3]; exit 0 }' fine.txt
    

    选项-F '\t' 将制表符设置为输入字段分隔符。条件NR==38 选择第38 行,split($2,f) 将空格上的第二个制表符分隔字段拆分为数组f。然后我们简单的打印f的第三个元素,和exit

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多