の:
awk $line -v ...
$line は、grep の出力を保持します。おそらく awk がコマンド ラインで表示することを期待するものではありません。また、これ:
for ((j=1; j<=$number_of_columns; j++))
do
anything > "history_files/history${i}"
done
ループのたびに履歴ファイルを上書きします。あなたが本当にそこで何をしたかったのか私にはわかりません。
ただし、スクリプトには他にも多くの問題があります。あなたは「例としてnumber_of_columns = 3およびselected_columns = [2 5 8]なので、文字列行からファイルhistory $ {i}に単語番号2、5、および8を出力したい」と言いました。
これは完全に awk では些細なことであり、awk の外部でも「grep」を実行する必要がないため、次のようにすべてを実行できます。
awk -v pat=" ${i}:\)" -v selected_columns="$selected_columns" '
BEGIN { number_of_columns = split(selected_columns,selected_columnsA) }
$0 ~ pat {
sep=""
for (j=1;j<=number_of_columns;j++) {
current_column = selected_columnsA[j]
printf "%s,%s",sep,lineA[current_column]
sep = "\t"
}
print ""
}
' "$1" > "history_files/history${i}"
それがうまくいかない場合は、元のスクリプトを修正しようとする代わりに、THAT を修正しましょう。上記の外側にループを囲んでいるように聞こえますが、それは awk スクリプトの一部でもある可能性があります。
更新されたOPに基づく編集:
たくさんのコメントを追加しましたが、質問がある場合はお知らせください。
$ cat file
44:) 2.884E-02 0.000E+00 0.000E+00 2.780E+02 0.000E+00 0.000E+00 9.990E+02
45:) 2.884E-02 0.000E+00 0.000E+00 2.780E+02 0.000E+00 0.000E+00 9.990E+02
1:) 3.593E-02 0.000E+00 0.000E+00 2.780E+02 0.000E+00 0.000E+00 1.000E+05
2:) 3.593E-02 0.000E+00 0.000E+00 2.780E+02 0.000E+00 0.000E+00 1.000E+05
$
$ cat tst.sh
selected_columns=(2 5 8)
selCols="${selected_columns[@]}"
awk -v selCols="$selCols" '
BEGIN { # Executed before the first line of the input file is read
# Split the string of selected column numbers, selCols, into
# an array selColsA where selColsA[1] has the value of the
# first space-separated sub-string of selCols (i.e. the number
# of the first column to print). Note that we dont need the
# number of columns passed into the script as a result of
# splitting the string is the count of elements put into the
# array as a return code from the split() builtin function.
numCols = split(selCols,selColsA)
}
{ # Executed once for every line of the input file
# Create a numerix suffix like "45" from the first column
# in the current line of the input file, e.g. "45:)" by
# just getting rid of all non-digit characters.
sfx = $1
gsub(/[^[:digit:]]/,"",sfx)
# Create the name of the output file by attaching that
# numeric suffix to the base value for all output files.
#histfile = "history_files/history" sfx
histfile = "tmp" sfx
# Loop through every column we want printed. selColsA[<index>]
# gives us a column number which we can then use to access the
# columns of the current line. Awk uses the builtin variable $0
# to hold the current line, and it autolatically splits it so
# that $1 holds the first column, $2 is the second, etc. So
# if selColsA[1] has the value 3, then $(selColsA[1]) would be
# the value of the 3rd column of the current input line.
sep=""
for (i=1;i<=numCols;i++) {
curCol = selColsA[i]
# Print the current column, prefixed by a tab for all but
# the first column, and without a terminating newline so the
# next column gets appended to the end of the current output line.
# Note that in awk "> file" has different semantics from shell
# and opens the file for writing the first time the line is hit
# like "> file" in shell, but then appends to it every time its
# hit afterwards, like ">> file" in shell.
printf "%s%s",sep,$curCol > histfile
sep = "\t"
}
# Add a newline to the end of the current output line
print "" > histfile
}
' "$1"
$
$ ./tst.sh file
$
$ cat tmp1
3.593E-02 2.780E+02 1.000E+05
$ cat tmp2
3.593E-02 2.780E+02 1.000E+05
$ cat tmp44
2.884E-02 2.780E+02 9.990E+02
$ cat tmp45
2.884E-02 2.780E+02 9.990E+02
ところで、学習のためだけに「列」と「行」という言葉を使用しましたが、参考までに、awk の用語は実際には「フィールド」と「レコード」です。