2

我正在尝试获取文件的列名并迭代打印它们。我想问题出在,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

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

4

5 回答 5

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永远不会扩展。
  • 该算法不好,因为您要调用4 次,headawk您不需要单个外部进程。

希望这可以帮助!

于 2013-06-21T18:39:38.127 回答
1

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

awk 'NR==1{for (i=2; i<=5; i++) print $i}' smaller.txt
于 2013-06-21T18:38:00.730 回答
0

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

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

对此:

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

那是:

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

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

于 2013-06-21T18:44:16.523 回答
0

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

for n in $(head smaller.txt)
do
  echo ${n}
done
于 2013-06-21T18:52:07.830 回答
0

有点像

  for x1 in $(head -n1 smaller.txt );do 
      echo $x1
  done
于 2013-06-21T19:00:17.170 回答