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

awk 関数を使用して、入力された列を動的に見つけて画面に表示するには、UNIX スクリプトを作成する必要があります。特定の列を正常に起動しましたが、異なる列に基づいて変更する方法がわかりません。講師はテスト データの列を選択するだけで、プログラムはその列を見つける必要があります。

私が試していたのは次のようなものでした:

#!/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 の man ページを調べてください。また、質問する際には、試したこと (コード) とエラー (ログ) を提示してください。これにより、人々はあなたを助けてくれる準備が整います。

于 2012-09-23T20:52:17.100 に答える