【问题标题】:Adding zeros in a line depending on the number of characters in other lines using awk使用 awk 根据其他行中的字符数在一行中添加零
【发布时间】:2014-04-25 17:14:24
【问题描述】:

我有一些看起来像这样的文本文件:

558903
5589157
55893434
55907235
.
.
.
127158709
1271587172
127158748

我只想更改每个文件的第一行和最后一行。

我想在第一行添加零,具体取决于前 10 行中的字符数。因此,例如,如果在前 10 行中,一行的最大字符数为 8(如在我的示例中),我需要在第一行添加尽可能多的零,以便它也有 8 个字符(在这种情况下是两个零)

我的最后一行需要同样的东西。所以再一次,我需要检查最后 10 行中的最大字符数(在我的示例中为 10),并在我的最后一行添加尽可能多的零以具有尽可能多的字符(在这种情况下只有一个零)。

我的输出应该是这样的:

55890300
5589157
55893434
55907235
.
.
.
127158709
1271587172
1271587480

在另一篇文章中,有人帮助我使用了这个脚本,但它根据所有行中的最大字符数为所有行添加了尽可能多的零(我只是注意到,这不是我需要的,所以这是我的错不是他的)。

$ awk '
{
    max = ((max > length($1)) ? max : length($1))
    a[NR] = $1
}
END { 
    for(x=1; x<=NR; x++) {
        n = max - length(a[x])
        while(n-->0) {
            a[x] = a[x] "0"
        }
        print a[x]
    }
}' file

提前致谢。

【问题讨论】:

  • 在过去的好日子里,这会过于本地化
  • 我认为它有很多文字只是因为我的英语不是那么好,我需要很多文字让你理解我。我不认为问题有那么难,但以我的技能我做不到。
  • 抛开问题的复杂性不谈,您应该从问题的答案中学到一些东西。在 3 个月左右的时间里,您发布了 quite a number of questions。很遗憾,您从这些答案中几乎一无所获。

标签: macos bash shell awk


【解决方案1】:

试试这个:

awk '
NR==FNR {
    len[NR] = length($1)
    last = NR
    next
}
FNR==1 {
    for(i=1; i<=num; i++) {
        fm = ((fm>len[i])?fm:len[i])
    }
    for(j=(last); j>(last-num); j--) {
        lm = ((lm>len[j])?lm:len[j])
    }
    $1 = $1 * 10 ** (fm-length($1))
}
FNR==last {
    $1 = $1 * 10 ** (lm-length($1))
}1' num=10 file file

您可以将 num= 设置为您希望比较的任意行数。根据在此范围内找到的最大长度,文件的第一行和最后一行将附加 0

【讨论】:

    【解决方案2】:

    使用 sed,直接就地编辑你的文件:

    head_max=$(( $(head -10 file.txt | wc -L) -1 ))
    tail_max=$(( $(tail -10 file.txt | wc -L) -1 ))
    
    sed -i.bk ":a 1 s/^.\{1,$head_max\}$/&0/;ta" file.txt
    sed -i.bk ":a $ s/^.\{1,$tail_max\}$/&0/;ta" file.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 2020-08-03
      • 1970-01-01
      • 2018-10-20
      • 2012-12-21
      • 1970-01-01
      相关资源
      最近更新 更多