1

次のようなタブ区切りのtxtファイルがあります。

1. C1   34    98
2. C3    2    45

バッチスクリプト(Linux)を作成するにはどうすればよいですか

最初の行の 2 番目のデータを変数 1 に抽出します

最初の行の 3 番目のデータを変数 2 に抽出します

1 行目の 4 番目のデータを変数 3 に抽出します

それから

変数 1、2、および 3 に定義されたパラメーターを使用して一連のスクリプトを実行します。

例えば

script $1 $2 $3 > path/file$1-$2-$3

スクリプトは変数の値をパラメーターとして使用し、変数の値に従って名前が付けられたファイルに結果を書き出す必要があります。したがって、各サイクルは新しいファイルになります)

タブ限定のtxtファイルの全行が使い切られたらループを終了します。

私はプログラマーではありません...

4

3 に答える 3

2

これは、シェルだけで実行できます (以下を参照してください。IFSのデフォルト値を想定しています) 。

while read -r _ x y z ;
do 
   echo "$x" "$y" "$z"; 
done < input.txt
于 2013-09-26T19:01:58.080 に答える
2

sh/bash/ksh を使用していると仮定すると、シェルは必要なものを提供します。

while read dummy v1 v2 v3 dummy
do
   echo $v1 $v2 $v3
   ./dostuff $v1 $v2 $v3
done < inputFile

行がどのようにトークン化されるかは、IFS変数によって異なります。デフォルトでは、タブ、スペース、および改行で構成されます。これは変更できますが、IFS をデフォルト値に戻さないとスクリプトが簡単に壊れてしまうため、内容を慎重に管理する必要があります。

ここで行っているのは、ファイルinputFileを読み取り、ダミー、v1、v2、v3、およびダミーの 5 つのフィールドに分割することです。これらは同じように簡単にa, b, c, d, e呼び出すことができますが、ジャンクしたいフィールドをダミーで呼び出すと、その意図は明らかです。

ファイルに 4 つのフィールドしかないことがわかっている場合は、最後のフィールドdummyは必要ありません (つまり、最初の行は にすることができますwhile read dummy v1 v2 v3)。本質的に、 の最後のフィールドwhile read [...]は残りの行を吸い上げます。そのため、入力がなければ1. 34 45 12 67 65最終dummy変数v3には が含まれます12 67 65。それにより、残りの行v312に読み込まれdummyます。これは、実験すれば理にかなっています:-)

于 2013-09-26T19:04:45.320 に答える
0
while read -r line
do
  var1=$(echo $line | awk '{print $2}')
  var2=$(echo $line | awk '{print $3}')
  var3=$(echo $line | awk '{print $4}')
  echo $var1 $var2 $var3
  ./yourscript.sh $var1 $var2 $var3
  # Do other stuff with these variables.
done < file
于 2013-09-26T18:45:02.493 に答える