2013-06-21 107 views
2

我试图获取文件的列名并以迭代方式打印它们。我想问题是与print $i,但我不知道如何纠正它。我试过的代码是:bash打印第一列至第n列迭代

#! /bin/bash 
for i in {2..5} 
do 
    set snp = head -n 1 smaller.txt | awk '{print $i}' 
    echo $snp 
done 

例输入文件:

ID Name Age Sex State Ext 
1 A 12 M UT 811 
2 B 12 F UT 818 

所需的输出:

Name 
Age 
Sex 
State 
Ext 

但输出我得到的是黑屏。

+0

不要设置在循环变量,删除echo语句。这应该就够了。 – devnull

+0

需要设置命令,因为命令的输出是从右侧传递的。我曾尝试在循环外设置变量。我得到错误。 – Vignesh

回答

4

你最好只是read文件的第一行,并把结果保存为一个数组:

read -a header < smaller.txt 

,然后printf的相关领域:

printf "%s\n" "${header[@]:1}" 

此外,这使用仅限,并且不涉及不必要的循环。

编辑。要还回答您的评论,你就可以遍历从而头字段:

read -a header < smaller.txt 
for snp in "${header[@]:1}"; do 
    echo "$snp" 
done 

编辑2.你原来的方法有很多很多的错误。下面是它的一个修正版本(虽然我写之前解决你的问题的一个更可取的方法):

for i in {2..5}; do 
    snp=$(head -n 1 smaller.txt | awk "{print \$$i}") 
    echo "$snp" 
done 
  • set可能不会做你认为它。
  • 由于awk '{print $i}'中的单引号,$i从未被扩大。
  • 这个算法不好,因为你打电话给headawk 4次,而你不需要一个外部进程。

希望这有助于!

+0

我希望它特别循环,因为我将在脚本中进一步使用值进行分析。这就是我想要它循环的原因。 – Vignesh

+0

@Vignesh没有问题,相应地编辑帖子。 –

+0

谢谢,但这并没有打印出任何值。 – Vignesh

1

您可以用awk本身打印:

awk 'NR==1{for (i=2; i<=5; i++) print $i}' smaller.txt 
0

你的代码的主要问题是你的赋值语法是错误的。更改此:

set snp = head -n 1 smaller.txt | awk '{print $i}' 

这样:

snp=$(head -n 1 smaller.txt | awk '{print $i}') 

即:

  • 不要使用setset用于设置shell选项,编号参数等,而不用于分配任意变量。
  • 删除=附近的空格。
  • 要运行命令并将其输出捕获为字符串,请使用$(...)(或`...`,但$(...)不太容易出错)。

这就是说,我同意gniourf_gniourf的方法。

+0

我试过更正,但我得到这个错误:未找到命令。 做:找不到命令。 非法变量名称。 – Vignesh

+0

@ Vignesh:显然你没有在Bash中运行你的脚本? – ruakh

0

这是另一种选择;不见得比任何其他人更好或更坏:

for n in $(head smaller.txt) 
do 
    echo ${n} 
done 
0

somthin像

for x1 in $(head -n1 smaller.txt);do 
     echo $x1 
    done 
相关问题