如果您必须在单独的进程中提取列,请使用paste
将它们缝合在一起。我假设您的 shell 是 bash/zsh/ksh,并且我假设您的示例输入中的空行不应该在那里。
paste -d, <(awk -F, '{print $2}' file) <(awk -F, '{print $3}' file)
生产
5,6
3,8
46,76
没有过程替换:
awk -F, '{print $2}' file > tmp1
awk -F, '{print $3}' file > tmp2
paste -d, tmp1 tmp2 > output
根据您的回答更新:
乍一看,这是一个令人困惑的设置。这行得通吗?
for (( x=1; x<=$number_of_features; x++ )); do
feature_number=$(sed -n "$x {p;q}" feature.txt)
if [[ -f out.txt ]]; then
cut -d, -f$feature_number file.txt > out.txt
else
paste -d, out.txt <(cut -d, -f$feature_number file.txt) > tmp &&
mv tmp out.txt
fi
done
那必须多次读取 file.txt 文件。显然只需要阅读一次会更有效率:
awk -F, -f numfeat=$number_of_features '
# read the feature file into an array
NR==FNR {
colno[++i] = $0
next
}
# now, process the file.txt and emit the desired columns
{
sep = ""
for (i=1; i<=numfeat; i++) {
printf "%s%s", sep, $(colno[i])
sep = FS
}
print ""
}
' feature.txt file.txt > out.txt