我有每日数据,我想将其复制到 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
。这可以根据需要进行调整。