bash迭代地在第一行打印到第n列

时间:2013-06-21 18:27:05

标签: linux bash shell awk

我正在尝试获取文件的列名并反复打印它们。我想问题是print $i,但我不知道如何纠正它。我试过的代码是:

#! /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

但我得到的输出是空白屏幕。

5 个答案:

答案 0 :(得分: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次,而您不需要单个外部流程。

希望这有帮助!

答案 1 :(得分:1)

您可以使用awk本身打印它:

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

答案 2 :(得分:0)

您的代码的主要问题是您的赋值语法错误。改变这个:

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

到此:

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

那是:

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

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

答案 3 :(得分:0)

这是另一种选择;不一定比其他任何一个更好或更差:

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

答案 4 :(得分:0)

somthin like

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