1

我在下面有这个输入:

 IDNO     H1  H2  H3    HT   Q1 Q2 Q3 Q4 Q5    M1  M2  EXAM

 OUT OF  100 100 150   350   30 30 30 30 30   100 150   400

 1434    22  95 135   252   15 20 12 18 14    45 121   245

 1546     99 102 140   341   15 17 14 15 23    91 150   325

 2352     93  93 145   331   14 17 23 14 10    81 101   260

(et cetera)

          H1  H2  H3    HT   Q1 Q2 Q3 Q4 Q5    M1  M2  EXAM
 OUT OF  100 100 150   350   30 30 30 30 30   100 150   400

我需要使用编写一个 unix 脚本来使用 awk 函数来动态查找输入的任何列并将其显示到屏幕上。我已经成功地唤醒了特定的列,但我似乎无法弄清楚如何根据不同的列进行更改。我的导师将简单地为测试数据选择一列,而我的程序需要找到该列。

我正在尝试的是:

#!/bin/sh

awk {'print $(I dont know what goes here)'} testdata.txt   

编辑:对不起,我应该更具体,他输入标题名称作为输入。例如"H3"。然后它需要 awk 。

4

3 回答 3

1

我想你只是在寻找:

#!/bin/sh
awk 'NR==1{ for( i = 1; i <= NF; i++ ) if( $i == header ) col=i }
  { print $col }' header=${1?No header entered} testdata.txt

这不会尝试处理未出现在输入中的列标题。(留给读者作为练习。)

于 2012-09-23T22:37:06.467 回答
0

您的行格式有很多变化(在字段数方面)。也就是说,像这样的东西呢:

echo "Which column name?"
read column
case $column in
  (H1) N=2;;
  (H2) N=3;;
  (H3) N=4;;
  ...
  (*) echo "Please try again"; exit 1;;
esac
awk -v N=$N '{print $N}' testdata.txt
于 2012-09-23T20:51:53.590 回答
0

好吧,您的问题非常分散,原则上您希望其他人编写您的 awk 脚本......您应该检查 awk 的手册页,它们的描述性很强。

我的 2 美分麦汁,例如(对于该行):myscript.sh:

#/bin/sh
cat $1 | awk -v a=$2 -v b=$3 '{if ($(a)==b){print $0}}';

如果你只想要一个专栏,那么,

#/bin/sh
cat $1 | awk -v a=$2 '{print $(a)}';

您的输入将是:

myscript.sh file_of_data col_num

再次重申:请研究 awk 的手册页。也请在提问时提供您尝试过的内容(代码)和错误(日志)。这将使人们更愿意帮助你。

于 2012-09-23T20:52:17.100 回答