【发布时间】:2017-09-20 07:34:52
【问题描述】:
我正在尝试从有关此主题的先前线程中运行一些修改过的代码。 我有一个文件 data.txt,其中第一行是标题。我想创建一个新文件,其中仅包含与第二个文件(list.txt)中的条目匹配的那些列。
数据.txt
1,2,3,4,5,6,7,8,9,10
1.000000,0,0,0,0,0,0,0,0,0
0,1.000000,0.031250,0,0,0,0.031250,0,0,0
0,0.031250,1.000000,0,0,0,0.062500,0,0,0
0,0,0,1.000000,0,0,0,0,0,0
0,0,0,0,1.000000,0,0,0,0,0
0,0,0,0,0,1.000000,0,0.062500,0,0
0,0.031250,0.062500,0,0,0,1.000000,0,0,0
0,0,0,0,0,0.062500,0,1.000000,0,0
0,0,0,0,0,0,0,0,1.000000,0
list.txt
3
5
7
9
想要的输出是
3,5,7,9
0,0,0,0
0.031250,0,0.031250,0
1.000000,0,0.062500,0
0,0,0,0
0,1.000000,0,0
0,0,0,0
0,1.000000,0
0,0,0,0
0,0,0,1.000000
我已经使用了下面的代码
echo "${DATAFILE:-data.txt}"
echo "${COLUMNFILE:-list.txt}"
awk {
j=1
while ((getline < COLUMNFILE) > 0) {
col[j++] = $1
}
n=j-1;
close(COLUMNFILE)
for (i=1; i<=n; i++) s[col[i]]=i
}
NR==1 {
for (f=1; f<=NF; f++)
if ($f in s) c[s[$f]]=f
next
}
{ sep=","
for (f=1; f<=n; f++) {
printf("%c%s",sep,$c[f])
sep=FS
}
print ""
}
DATAFILE
我得到下面的结果,它复制了 data.txt 中的行而不做任何选择。 list.txt 中的条目打印在文件末尾
1,2,3,4,5,6,7,8,9,10
1,2,3,4,5,6,7,8,9,10
1.000000,0,0,0,0,0,0,0,0,0
1.000000,0,0,0,0,0,0,0,0,0
0,1.000000,0.031250,0,0,0,0.031250,0,0,0
0,1.000000,0.031250,0,0,0,0.031250,0,0,0
0,0.031250,1.000000,0,0,0,0.062500,0,0,0
0,0.031250,1.000000,0,0,0,0.062500,0,0,0
0,0,0,1.000000,0,0,0,0,0,0
0,0,0,1.000000,0,0,0,0,0,0
0,0,0,0,1.000000,0,0,0,0,0
0,0,0,0,1.000000,0,0,0,0,0
0,0,0,0,0,1.000000,0,0.062500,0,0
0,0,0,0,0,1.000000,0,0.062500,0,0
0,0.031250,0.062500,0,0,0,1.000000,0,0,0
0,0.031250,0.062500,0,0,0,1.000000,0,0,0
0,0,0,0,0,0.062500,0,1.000000,0,0
0,0,0,0,0,0.062500,0,1.000000,0,0
0,0,0,0,0,0,0,0,1.000000,0
0,0,0,0,0,0,0,0,1.000000,0
3
3
5
5
7
7
9
9
非常感谢任何帮助。
【问题讨论】:
-
awk无法“看到”外部变量、数据/列文件。你需要把它们传进去,即。awk -v COLF="$COLF" '{ awk program}' "$DATAFILE"。我没有仔细查看您的其余代码,但您所拥有的似乎是一个很好的尝试。祝你好运。 -
使用
getline很少是正确的方法,在这种情况下肯定不是。请参阅 awk.freeshell.org/AllAboutGetline 了解何时应考虑使用getline以及所有注意事项。