我有一个小问题,我很乐意帮助我。
总之,我有一个文件:
1,5,6,7,8,9
2,3,8,5,35,3
2,46,76,98,9
我需要从中读取特定行并将其打印到另一个文本文档中。我知道我可以使用(awk '{print "$2" "$3"}'
)打印彼此相邻的第二列和第三列。但是,我需要使用两个语句(awk '{print "$2"}' >> file.text
)然后(awk '{print "$3"}' >> file.text
),但这两个列会出现在彼此之下,而不是彼此相邻。
如何让它们彼此相邻?
答案 0 :(得分:3)
如果必须在单独的进程中提取列,请使用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
答案 1 :(得分:0)
感谢所有人为答案做出贡献。我相信我的问题应该更清楚,对不起。
我的代码如下:
for (( x = 1; x <= $number_of_features ; x++ )) # the number extracted from a text file
do
feature_number=$(awk 'FNR == "'$x'" {print}' feature.txt)
awk -F, '{print $"'$feature_number'"}' file.txt >> out.txt
done
基本上,我从文本文档中提取要素编号(与列编号相同),然后打印该列。文本文档可能包含许多功能编号。
事情是,每次我有不同的功能号码(反映列号)。因此,应用上述解决方案不足以解决这个问题。
我希望现在更清楚了。
请等待你的意见。
由于 艾哈迈德
答案 2 :(得分:-1)
而不是使用awks文件重定向,使用shell重定向,例如
awk '{print $2,$3}' >> file
逗号将替换为输出字段分隔符的值(默认为空格)。