【发布时间】:2014-04-12 05:41:42
【问题描述】:
遍历编写程序时已知的字符列表(在本例中,字符为“X”、“Y”、“Z”):
for (i = 1; i <= 3; ++i) {
c = substr("XYZ", i, 1)
# do something with the character
}
问题: 有没有更古怪的方法?请注意,这与 this question 不同,因为我要迭代的字符over 不是输入的一部分。
为了把它放在上下文中,我需要计算 X、Y 和 Z 在一行中特定位置上所有行的出现次数。输入应仅包含相同长度行上的 X、Y 和 Z:
$ cat input.txt
XYXXXYZZYXY
XXXYYYZYYZY
YZZZZYZZXZZ
XXZXXYYZXZY
$ foo.awk < input.txt
X 3 2 2 2 2 0 0 0 2 1 0
Y 1 1 0 1 1 4 1 1 2 0 3
Z 0 1 2 1 1 0 3 3 0 3 1
我现在是foo.awk:
#!/bin/awk -f
BEGIN {
FS = ""
}
NR == 1 {
len = NF
}
{
for (i = 1; i <= NF; ++i)
++profile[$i][i]
}
END {
for (c = 1; c <= 3; ++c) {
char = substr("XYZ", c, 1)
printf "%s", char
for (i = 1; i <= len; ++i)
printf " %d", profile[char][i]
printf "\n"
}
}
我以前没有使用过 awk,所以可能我的整个方法完全错误。
【问题讨论】:
-
提供一个示例文本以及从中得到什么会有很大帮助。
-
@Jotne 你当然是对的,我将它添加到问题中。