【发布时间】:2014-03-26 19:24:27
【问题描述】:
文件具有由制表符分隔的唯一“标签”和“值”列表。我想根据给定的值重复标签。输入文件示例:
标记值
AAAAA 2
BBBBB 1
CCCCC 3
DDDDD 5
预期的输出文件
AAAAA
AAAAA
BBBBB
CCCCC
CCCCC
CCCCC
DDDDD
DDDDD
DDDDD
DDDDD
DDDDD
能否请您告诉我 awk/sed 命令。非常感谢。
【问题讨论】:
文件具有由制表符分隔的唯一“标签”和“值”列表。我想根据给定的值重复标签。输入文件示例:
标记值
AAAAA 2
BBBBB 1
CCCCC 3
DDDDD 5
预期的输出文件
AAAAA
AAAAA
BBBBB
CCCCC
CCCCC
CCCCC
DDDDD
DDDDD
DDDDD
DDDDD
DDDDD
能否请您告诉我 awk/sed 命令。非常感谢。
【问题讨论】:
GNU awk 的替代版本:
awk '{while($2--) print $1}'
这不是一个用 sed 解决的好问题。您需要将数字 n 替换为 n 1(例如 3 与 111),并在使用这些 1 时打印单词。
【讨论】:
这个awk 应该这样做:
awk '{for (i=1;i<=$2;i++) print $1}' file
AAAAA
AAAAA
BBBBB
CCCCC
CCCCC
CCCCC
DDDDD
DDDDD
DDDDD
DDDDD
DDDDD
它循环在列#2中找到的次数,然后打印列#1中的单词
【讨论】:
这是perl 备用:
$ perl -ane 'print "$F[0]\n"x$F[1]' file
AAAAA
AAAAA
BBBBB
CCCCC
CCCCC
CCCCC
DDDDD
DDDDD
DDDDD
DDDDD
DDDDD
【讨论】:
这可能对你有用(GNU sed):
sed -r 's/(\S+)\s+(\S+)/seq \2 | sed c\1/e' file
将该行拆分为seq 和sed 命令的参数并进行评估。
【讨论】:
在sed 中做算术很痛苦,所以我会避免这种情况。 awk和perl是不错的选择,你也可以直接用bash做:
while read tag value; do
while ((value--)); do
printf "%s\n" "$tag"
done
done < infile
或者作为单行:
while read tag value; do while ((value--)); do printf "%s\n" "$tag"; done; done < infile
输出:
AAAAA
AAAAA
BBBBB
CCCCC
CCCCC
CCCCC
DDDDD
DDDDD
DDDDD
DDDDD
DDDDD
【讨论】: