【问题标题】:AWK not print columns when converting row to columns on AIX在 AIX 上将行转换为列时,AWK 不打印列
【发布时间】:2016-05-13 04:28:11
【问题描述】:

我正在为以下文件在 AIX 上将行转换为列

cat test.txt
SUV
BMW X5
CADILLAC ESCALDE
Honda CRV
Toyota RAV

Sedan
Lexus is250
Acura
Suburu

将行转换为列

cat test.txt |awk -v RS="" '{$1=$1}1'
SUV
BMW X5
CADILLAC ESCALDE
Honda CRV
Toyota RAV
Sedan
Lexus is250
Acura
Suburu

但是

cat test.txt | awk -v RS="" '{print $1, $2, $3, $4, $5}'
SUV BMW X5 CADILLAC ESCALDE 
Sedan Lexus is250 Acura 

那么,如何在不指定它们的情况下打印以下所有列

SUV BMW X5 CADILLAC ESCALDE Honda CRV Toyota RAV
Sedan Lexus is250 Acura Suburu

谢谢

【问题讨论】:

  • 如果您使用的 awk 的行为与您在输入文件中描述的一样,那么该 awk 已严重损坏。买一个新的,最好是傻瓜。

标签: awk aix


【解决方案1】:

我无法在 AIX 上验证这一点,但请尝试一下

 awk -F'\n' -v RS= '{for(i=1;i<=NF;i++) printf "%s",$i OFS; print ""}' 

在您的脚本中使用了默认字段分隔符,这就是您看不到来自 $1..$5 的完整记录的原因

如果你知道你有 5 个字段

awk -F'\n' -v RS= '{print $1,$2,$3,$4,$5}'

应该也可以。

【讨论】:

  • Y NO '急于救援!'?
  • 不管它是否有效 - 他的 awk 显然坏了,所以他不应该使用它(谁知道它还有什么坏了?)当他得到一个工作的 awk他不需要解决方法。
【解决方案2】:

另一种单行:

awk -F'\n' -v RS='' '{$1=$1};1' test.txt

$1=$1 语法强制 awk 重新计算 $0,这会将字段分隔符从 '\n' 转换为 ' '(默认 OFS)。

【讨论】:

  • 这可能不适用于 AIX。分号也是多余的。
  • @karakfa 我通常不使用分号。但是,SO上的某人曾经说过这是必需的。例如,gawk 的人说:“可以将多个语句放在一行中,用“;”分隔它们。这适用于模式-动作对的动作部分中的语句(通常情况),也适用于模式动作语句本身。”即使它这么说,没有它它也可以工作。
  • 正确但1不是一个语句,它是暗示默认语句{print}的条件。
  • 我指的是:“......以及模式动作语句本身。”......意思是一行中的模式动作对需要在它们之间使用分号。
  • 由于使用;s 分隔语句的要求不是原始 awk 语言的一部分,并且自从有人决定引入它以来,没有任何 awk 解释器强制执行它,如果任何 awk 解释器曾经强制执行它那么该解释器将很快再次被丢弃,取而代之的是一个不这样做的解释器,这样在没有那种毫无意义的结构的情况下编写的大量 awk 脚本将继续发挥作用。因此,请忽略该要求 - 它无用且不向后兼容,因此不是现在也永远不会实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 1970-01-01
相关资源
最近更新 更多