如何将每一行的值重复n次?

如何将每一行的值重复n次?

我有每日数据,我想将其复制到 24 小时数据中,以保持每小时时间步长的值相同。我的数据如下所示:

day       Value
01/01/2012  2
01/02/2012  3

然后我希望输出是:

Day   Value
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
.
.
.

01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
.
.
.

即每天24次。

答案1

使用awk

awk 'NR == 1 {print $0}; NR > 1 {for(i=0;i<24;i++) print $0}' InputFile

答案2

方法#1

如果将以上行放入名为的文件中,sample.txt则可以使用tail, xargs, 和printf来执行此操作:

$ cat <(head -1 sample.txt) <(tail -n +2 sample.txt \
    | xargs -I{} printf "{}\n%.0s" {1..25})

细节

假设您有以下类型的文件。

$ more sample.txt 
day       Value
01/01/2012  2
01/02/2012  3

head保留以下位置的标题行sample.txt

$ head -1 sample.txt 
day       Value

tail执行以下操作:

$ tail -n +2 sample.txt
01/01/2012  2
01/02/2012  3

xargs从文件中获取每一行并调用将printf其打印 X 次,其中范围{1..25}生成计数。

它将cat <(...) <(...)所有内容放在一起。

方法#2

形式与第一个类似,但略有不同。它不使用子 shell 来cat最终构造输出,而是使用单个子 shell 将各个命令的输出链接在一起。它还使用了一种更传统的方法,即使用while循环来遍历输入文件的每一行sample.txt。它再次使用相同的技术来砍掉第二行和上面的内容,使用tail.

$ (head -1 sample.txt; while read i ; do seq 25 \
   | xargs -i -- echo $i ; done < <(tail -n +2 sample.txt))

形式如下:

$ ( ... ; while .... done <(tail ...) )

外括号的作用与cat第一个示例中的相同,将所有输出放在一起。

多个文件

OP询问如何修改这个解决方案,以便它可以用于处理1000多个文件。例如,包装方法 #1 形式的代码块将产生如下所示的结果:

#!/bin/bash

for file in *.txt; do
  cat <(head -1 $file) <(tail -n +2 $file | xargs -I{} printf "{}\n%.0s" {1..25}) | tee new_$file
done

这将循环遍历所有名为 的文件*.txt并将它们写入名为 的文件new_*.txt。这可以根据需要进行调整。

相关内容