使用 awk 根据一列中的条件值重新格式化一行数据

问题描述 投票:0回答:1

我有一组格式如下的数据:

r 0.000 0 0 1.000 0.010

第 2 列和第 5 列中的数字有所不同,因为它是位置数据(第 2 列)和行程时间数据(第 5 列)。然而,每次第 5 列有 1.000 或 -1.000 时,它都是表示一组新信息的特定行,因此我需要使用 awk 来检查这些值并编辑相应的行。

我尝试过各种形式的

awk '{if ($5=-1.000) ($1="s" && $5=0)}' inputfile > outputfile

包括仅尝试将第一列从 r 更改为 s。结果应该是

s 0.000 0 0 0 0.010

对于第 5 列的每一行,其值为 -1.000,但到目前为止,我的结果只是完全空白的输出文件。有时我的输出也会用 -1 替换整个第 5 列,这会擦除所有重要数据。

编辑:还要澄清数据有数百行长。这是数据的前 10 行,显示了它现在的组成:

r 0.000 0 0 1.000 0.010 
r 0.050 0 0 0.044 0.010 
r 0.100 0 0 0.075 0.010 
r 0.150 0 0 0.108 0.010 
r 0.200 0 0 0.117 0.010 
r 0.250 0 0 0.160 0.010 
r 0.300 0 0 0.197 0.010 
r 0.350 0 0 0.214 0.010 
r 0.400 0 0 0.259 0.010 
r 0.450 0 0 0.268 0.010 

编辑:谢谢您的帮助,我最终明白了我做错了什么。但我不想删除这个问题。

if-statement awk multiple-columns reformatting
1个回答
1
投票

假设:

  • 如果第 5 列是
    1.000
    -1.000
  • ,则应用编辑
  • 将所有(输入)行打印到标准输出

输入示例:

$ cat inputfile
r 0.000 0 0 1.000 0.010
r 0.000 0 0 -1.000 0.010
r 0.050 0 0 0.044 0.010
r 0.100 0 0 0.075 0.010
r 0.150 0 0 0.108 0.010
r 0.200 0 0 0.117 0.010
r 0.250 0 0 0.160 0.010
r 0.300 0 0 0.197 0.010
r 0.350 0 0 0.214 0.010
r 0.400 0 0 0.259 0.010
r 0.450 0 0 0.268 0.010

调整OP的当前代码:

awk '
{ if ($5 == -1.000 || $5 == 1.000) {          # test 5th column
     $1="s"                                   # modify 1st and
     $5=0                                     # 5th columns
  }
}
1                                             # print current line
' inputfile

# or as a one-liner:

awk '{ if ($5 == -1.000 || $5 == 1.000) { $1="s"; $5=0 } } 1' inputfile

这些都会生成:

s 0.000 0 0 0 0.010
s 0.000 0 0 0 0.010
r 0.050 0 0 0.044 0.010
r 0.100 0 0 0.075 0.010
r 0.150 0 0 0.108 0.010
r 0.200 0 0 0.117 0.010
r 0.250 0 0 0.160 0.010
r 0.300 0 0 0.197 0.010
r 0.350 0 0 0.214 0.010
r 0.400 0 0 0.259 0.010
r 0.450 0 0 0.268 0.010
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.