动态地改变被困的东西

时间:2012-09-23 20:24:55

标签: unix dynamic awk grep

我在下面输入了这个输入:

 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"。然后它需要唤醒它。

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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

答案 2 :(得分: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的手册页。当问问题时你还要问你所尝试的(代码)和错误(日志)。这将使人们更愿意为您提供帮助。