【问题标题】:Awk uncorrect tab spaceawk 不正确的制表符空间
【发布时间】:2013-10-18 05:07:08
【问题描述】:

我有一些类似下面的行保存到一个 txt 文件中:

 Mike Tyson    1    2    3    4    5
 Alì     1    2   3   4   5

每个不同的字段都用制表符分隔,但在第一个字段中,我可以只用空格分隔 2 个单词。 我怎样才能对 awk 有正确的解释?我只想要这样的标签分隔的值:

 $a=mike tyson
 $b=1
 $c=2
 etc etc....

现在,我正在使用一个while循环来读取每一行,完成

 done < <(awk 'NR>0' file.txt)

但此命令将值“mike tyson”视为两个不同的字段。

【问题讨论】:

  • Tab separated values in awk 的可能重复项
  • 在 shell 中使用 while 循环来解析文件几乎总是错误的方法。告诉我们您对示例输入和预期输出的操作,我们可以帮助您以正确的方式进行操作。

标签: bash awk


【解决方案1】:

尝试更改为:

done < <(awk -F"\t" 'NR>0' file.txt)

awk 确实将任何空格(空格和制表符)视为字段分隔符。 将其设置为仅选项卡,防止它用空格分隔文件。

【讨论】:

  • -F'\t' 是正确的方向,但我怀疑这会在一段时间循环中起作用。事实上,有/没有-F'\t',awk 行会给出相同的输出,对吧?或者我错了……
  • 如果处理逻辑在awk 内,-F 会有所不同。在 OP 中,情况并非如此:您可以仅将 &lt;(awk -F"\t" 'NR&gt;0' file.txt) 替换为 file.txt(没有 awk),这对 while 循环没有任何影响。
【解决方案2】:

问题不在于awk,因为您正在解释bash 中的列。

也许你正在寻找这样的东西:

IFS=$'\t'
while read a b; do
    echo a=$a
    echo b=$b
done < file.txt

在您的示例代码中,awk 似乎没有起到任何作用。

【讨论】:

  • 在给定各种输入值的情况下会以各种神秘的方式失败。
  • @EdMorton 你的意思是,它可能在某些情况下会失败。如果发帖人有一个不可行的极端案例,他可以发布它,我们可以提供更好的东西,也许。
  • 我怀疑发帖人是否有任何理由怀疑这会失败的情况,并且他可能会使用它一年,然后才能击中一个,然后必须弄清楚到底发生了什么.这根本不是正确的方法,最重要的是,除非您有非常具体的理由不这样做(即使用 -rread,引用您的变量, 并使用printf 而不是echo)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2021-01-06
  • 2018-01-04
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
相关资源
最近更新 更多