【问题标题】:Inconsistency in output field separator输出字段分隔符不一致
【发布时间】:2021-05-25 03:26:52
【问题描述】:

我们必须找出最后 2 个编号之间的差 (d),并按升序显示 d 值最高的行
输入

1 | Latha | Third | Vikas | 90 | 91  
2 | Neethu | Second | Meridian | 92 | 94  
3 | Sethu | First | DAV | 86 | 98  
4 | Theekshana | Second | DAV | 97 | 100  
5 | Teju | First | Sangamithra | 89 | 100  
6 | Theekshitha | Second | Sangamithra | 99 |100 

需要的输出

4$Theekshana$Second$DAV$97$100$3  
5$Teju$First$Sangamithra$89$100$11  
3$Sethu$First$DAV$86$98$12 
awk 'BEGIN{FS="|";OFS="$";}{
    avg=sqrt(($5-$6)^2)
    print $1,$2,$3,$4,$5,$6,avg
}'|sort -nk7 -t "$"| tail -3

输出:

4 $ Theekshana $ Second $ DAV $ 97 $ 100$3  
5 $ Teju $ First $ Sangamithra $ 89 $ 100$11  
3 $ Sethu $ First $ DAV $ 86 $ 98$12  

如您所见,$ 符号前后有空格,但最后一列 (avg) 没有空格,请说明原因

2)

awk 'BEGIN{FS=" | ";OFS="$";}{
    avg=sqrt(($5-$6)^2)
    print $1,$2,$3,$4,$5,$6,avg
}'|sort -nk7 -t "$"| tail -3

输出

4$|$Theekshana$|$Second$|$0  
5$|$Teju$|$First$|$0  
6$|$Theekshitha$|$Second$|$0  

我没有提到|作为输出字段分隔符但它仍然出现,为什么会发生这种情况并且差异也为零

我刚接触 unix 6 天,即使很容易也请回答

【问题讨论】:

  • 可以说这严格来说是一个 awk 问题,而不是一个 bash 问题——如果您的脚本是 awk 脚本(以 #!/usr/bin/awk -f 开头并且正文仅包含),您仍然会遇到问题awk 代码——尽管这将使它负责在纯 awk 中执行 sorttail 部分,因此需要进行其他更改)

标签: bash shell unix awk


【解决方案1】:

您的字段分隔符只是管道符号,因此周围的空格是字段定义的一部分,这就是您在输出中看到的内容。在组合使用中,管道具有正则表达式的特殊含义,需要转义。在第二种情况下,这意味着空格或空格是字段分隔符。

$ awk 'BEGIN {FS=" *\\| *"; OFS="$"} 
             {d=sqrt(($NF-$(NF-1))^2); $1=$1; 
              print d "\t" $0,d}' file | sort -n | tail -3 | cut -f2-

4$Theekshana$Second$DAV$97$100$3
5$Teju$First$Sangamithra$89$100$11
3$Sethu$First$DAV$86$98$12

轻微的重写将消除字段依赖的数量并修复格式。

【讨论】:

  • 我认为您的意思是管道符号,而不是制表符。
  • 哈,我的意思是管道但不止一次键入了 tab。
  • print d "\t" $0,d}' file | sort -n | tail -3 | cut -f2- 你能解释一下 1)为什么你在 print 语句中使用了 d 两次 2)你从来没有提到要排序的列,但它仍然在 d 上排序 3)“cut -f2-”你没有提到分隔符,但它仍然有效
猜你喜欢
  • 2014-01-17
  • 2011-07-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
相关资源
最近更新 更多