Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
awk从文件中读取特定列_Awk - Fatal编程技术网

awk从文件中读取特定列

awk从文件中读取特定列,awk,Awk,我有一个小问题,如果能帮我解决,我将不胜感激 总之,我有一个文件: 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),但这两列将显示在彼此下方,而不是彼此旁边 如何使它们显示在一起?

我有一个小问题,如果能帮我解决,我将不胜感激

总之,我有一个文件:

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
),但这两列将显示在彼此下方,而不是彼此旁边


如何使它们显示在一起?

使用shell重定向,而不是使用awks文件重定向

awk '{print $2,$3}' >> file
逗号将替换为输出字段分隔符的值(默认为空格)。

如果必须在单独的过程中提取列,请使用将它们缝合在一起。我假设你的shell是BasH/ZS/KSH,我假设你的示例输入中的空白行不应该存在。
paste -d, <(awk -F, '{print $2}' file) <(awk -F, '{print $3}' file)
在没有过程替换的情况下:

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
((x=1;x out.txt)的

其他的
粘贴-d,out.txt tmp&&
mv tmp out.txt
fi
完成
必须多次读取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
awk-F,-F numfeat=$numberoffeatures'
#将要素文件读入数组
NR==FNR{
colno[++i]=$0
下一个
}
#现在,处理file.txt并发出所需的列
{
sep=“”

对于(i=1;i感谢大家在回答中的贡献。我相信我的问题应该更清楚,对此表示抱歉

我的代码如下:

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
for((x=1;x>out.txt)
完成
基本上,我从文本文档中提取特征编号(与列编号相同),然后打印该列。文本文档可能包含许多特征编号

问题是,每次我都有不同的特征编号(反映列编号)。因此,应用上述解决方案不足以解决此问题

我希望现在更清楚了

请等待您的评论

谢谢
Ahmad

为什么需要使用两个语句?我不知道为什么要使用awk'{print“$2”}>>file.text而不是awk'{print$2,$3}>>file.text不要引用字段引用:
awk'{print“$2”}“
将为您提供字符
$
2
,而不是第二列的值感谢Glenn的快速响应!我会尝试一下,然后回复您,谢谢。您应该使用此信息编辑您的问题,而不是将其作为答案提供。
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