【问题标题】:Repeat each line into new one将每一行重复成新的
【发布时间】:2013-07-09 20:02:11
【问题描述】:

我有一个如下所示的测试文件:

Hello 2
Bye 3
Tango 4

(真实文件有30000行)。

我想要一个如下所示的新文件:

Hello
Hello
Bye
Bye
Bye
Tango
Tango
Tango
Tango

我试过了,但没用:

#!/bin/bash

Mywords=( $(awk '{ print $1 }' test) )
MyInteger=( $(awk '{ print $2 }' test) )
Countline=$(awk '{ print $1 }'  test | wc -l)

for ((i=0; i<$Countline ;i=i+1))
do
    for ((y=0; y<${MyInteger[$i]}  ;y=y+1))
        echo -e ${Sequences[$i]} > mynewfile
    do
    done
done

Mywords 数组包含我的所有单词(ByeHelloTango),MyInteger 数组包含我希望每个单词重复的次数。

【问题讨论】:

  • 我改进了代码的格式。现在应该立即清楚它的一个问题:您的 echo 语句位于 for-loop 的标头中,而不是其主体。
  • 这行不通,因为第二个 do/done 是空的。
  • 不要使用echo -e 可憎;请改用便携式printf
  • 我不知道您在这里实际要解决什么问题,但是创建一个包含高度冗余信息的文件让我觉得完全浪费资源。为什么在实际需要行时不进行迭代?
  • @Jens make_repeats &lt;in &gt;bigfile; somecommand &lt; bigfile ; rm bigfile 不会造成灾难性的资源浪费,尤其是当需要在 bigfile 上运行更多不同的命令时,它开始在能源(cpu 使用)方面更有效;)

标签: arrays linux bash loops


【解决方案1】:

使用 awk:

awk '{for (i=0; i<$2; i++) print $1}' file > output

【讨论】:

  • 大声笑我正在写一个与你的字符完全匹配的答案
  • @Lorkenpeist:我也发生过几次:P 希望你早点发帖,因为我已经达到了今天的代表门槛。
  • 谢谢,很有用。顺便说一句,看起来很简单:)
  • @JS웃:非常感谢您这么体贴。
  • @Adeel:不客气,是的,这确实是 awk 的一个简单问题。
【解决方案2】:

或perl

perl -ane 'chomp; print "$F[0]\n" x $F[1]' filename

或重击

while read str num; do
    for ((i=0; i<$num; i++)); do
        echo $str
    done
done < filename

【讨论】:

    【解决方案3】:

    另一个深奥的变体:

    xargs -n2 seq -f <input.txt >out.txt
    

    它不是很有效,因为(在您的情况下)将启动 30k 次 seq 命令,因此当重复计数大于 30-40k 时,它可以比 awk 有效。 (至少在我的笔记本上)

    解释:

    xargs 将为每个 2 个参数运行,seq -f arg1 arg2 因此,您的输入将运行

    seq -f Hello 2
    seq -f Bye 3
    seg -f Tango 4
    

    对于seq,如果您提供没有数字规范的format 字符串(%g),它只需重复format N 次,所以

    seq -f hello 10
    

    等价于

    yes hello | head -10
    

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 2020-01-22
      • 2020-11-10
      • 1970-01-01
      • 2020-04-11
      • 2017-05-08
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      相关资源
      最近更新 更多