【问题标题】:awk command with if and substring带有 if 和子字符串的 awk 命令
【发布时间】:2014-02-22 14:04:39
【问题描述】:

我有一个如下所示的输入文件 (input.txt):

    id01    90      5
    id01    80      4
    id01    79      3
    id13    95      5
    id01    77      3
    id01    85      4
    id15    92      5
    id17    99      5
    id18    65      2
    id19    72      3

我想将文件输出为 output.txt:

1    90      5
1    80      4
1    79      3
13   95      5
1    77      3
1    85      4
15   92      5
17   99      5
18   65      2
19   72      3 

我进行了搜索,并且能够找到一些单独工作的代码示例(比如只是子字符串部分,或者只是 if 部分)但是当我把整个东西放在一起时,我遇到了语法错误。我在 ssh 环境中执行此操作,我发现 sh 和 bash 之间的语法略有不同。以下是我能够想出但给我语法错误的内容:

awk -F $'\t' 'BEGIN {OFS = FS} { num = substr($1, 3, 1) if (num == "0") num2 = substr($1,4,1) else num2= substr($1,3,2)  {print num2, $2, $3 } }' input.txt > output.txt 

我将不胜感激。

谢谢!

【问题讨论】:

  • 有些地方你把id01改成1,其他改成01,对吗?
  • 不,抱歉,我更新了输入文件。它应该只有 1 而没有开头的 0

标签: if-statement awk sh substr


【解决方案1】:

有人喜欢awk

awk '{sub(/id/,"",$1);$1=$1+0}8' OFS="\t"
1       90      5
1       80      4
1       79      3
13      95      5
1       77      3
1       85      4
15      92      5
17      99      5
18      65      2
19      72      3

更新以摆脱领先的0

【讨论】:

  • +1 用于该方法,但恕我直言,使用未设置的变量 x 而不是简单的空字符串 "" 混淆了它。如果发布者想要去掉前导零,它只需要对 1 美元做一些数学运算:{sub(/id/,"",$1);$1+=0}8
  • OP 不清楚0 是否应该去。我本可以发布awk '{sub(/id/,"",$1)} {print $0}'
  • 没错。因此**if** the poster...。使用print $0 不会做任何8 做不到的事情。
  • 感谢 Jotne,这也有效。我只是想知道8的主要功能是什么,只是为了我的理解。我试图删除它,结果没有打印,所以我猜它与打印有关,但不是 100% 确定。谢谢。
  • awk 中除0 之外的任何数字都表示为真。如果有些是真的,请执行默认操作,打印。所以8 只是意味着打印记录。 8 提供与11 = 1 {print} = 1 {print $0} 相同的操作
【解决方案2】:

试试这个sed

sed 's/id//g' file.txt

要去掉前导零,

sed 's/id0*//g' file.txt

【讨论】:

  • +1 是一种合理的方法,sed 's/id0*//g' 也可以在需要时去掉前导零。
  • 谢谢埃德!这很完美。基本上,剩下的唯一事情是生成的文件不像以前那样用制表符分隔,但我想我可以在开头添加这个“awk -F $'\t''BEGIN {OFS = FS}”并且可以工作吗?
  • 嗨,埃德!对不起,它实际上工作得很好。我为演示我的问题而创建的虚拟文件不是制表符分隔的,这就是输出不是的原因。再次感谢!我不确定如何接受这个答案,sat 建议的答案部分不正确,但目前它被选为答案。
猜你喜欢
  • 2014-05-05
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
相关资源
最近更新 更多