2013-01-15 43 views
0

我有一个小问题,我希望能帮助我。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),但这两列会出现在对方下方,而不是彼此相邻。

我该如何让它们出现在彼此旁边?

+0

为什么你需要使用两个语句? – Thor

+0

我不知道为什么你使用awk'{print'$ 2“}'>> file.text而不是awk'{print $ 2,$ 3}'>> file.text – Vijay

+1

不要引用字段引用:'awk'{print “$ 2”}''会给你字符'$'和'2',而不是第二列的值 –

回答

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 
+0

感谢Glenn的快速响应! 我会尽力回复你 干杯 –

+0

你好格伦,你介意看下面请。谢谢! –

+0

尊敬的格伦专家。你令人惊叹。万分感谢! –

-1

,而不是使用awks文件重定向,使用壳重定向例如

awk '{print $2,$3}' >> file 

逗号置换为输出字段分隔符(默认空间)的值。

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 

基本上,我提取特征数目(其是相同的列号)从一个文本文档,然后打印该列。该文本文件可能包含许多功能编号。

事情是,每次我有不同的功能号码(这反映了列号)。所以,应用上述解决方案对于这个问题是不够的。

我希望现在更清楚。

请等待您的意见。

感谢 艾哈迈德

+1

你应该用这些信息来编辑你的问题,而不是将其作为答案。 –