0

私の質問は 2 つに分割できます。まず、次のようなデータ ファイル (file.dat) があります。

Parameter stuff number 1 (1029847) word index 2 (01293487), bla bla
Parameter stuff number 3 (134123) word index 4 (02983457), bla bla
Parameter stuff number 2 (109847) word index 3 (1029473), bla bla
etc...

括弧内の数値を抽出し、変数に保存します。たとえば、1 行目の最初の数値は「x1」、同じ行の 2 番目の数値は「y1」、2 行目の「x2」と「y2」などです。など... 番号は行ごとにランダムに変化し、その位置 (必要に応じて列内) は行ごとに同じままです。行数は可変 (0 ~ 'n') です。これどうやってするの?お願いします。

私は答えを探していて、使用できるさまざまなコマンドで迷子になりますが、それらの答えは、単語が最後または括弧内にあるが、1行に1つしかないなどの特定の例に対応しています.とにかく、ここに私が持っているものがありますこれまでに行われた(私は初心者です):

1) 文字列の数字の一部ではない文字を取り除きます

sed -i 's/(//g' file.dat
sed -i 's/),//g' file.dat

2) 欲求不満から、行全体を変数に出力することにしました (近づいていますか?) 2.1) 反復する行数を取得します。

numlines=$(wc -l < file.dat)

2.2) numlines へのループ (このビットはまだテストしていません!)

for i in {1..$numlines}
do
line${!i}=$(sed -n "${numlines}p" file.dat)
done

2.3) 私はここであきらめました。

2 番目の質問も同様で、単純に好奇心からです。スペース、タブ、カンマ、任意の区切り記号で区切られたデータベースを想像してみてください。このデータベースには可変行数 ('n') があり、1 行あたりの文字列も異なる場合があります ('k')。「j」番目の文字列の「i」行の値を抽出し、変数「x」に保存するにはどうすればよいですか?

4

3 に答える 3

3

これは、bash 配列変数に値を格納する簡単な方法です。

x=("" $(awk -F"[()]" '{printf "%s ",$2}' file))
y=("" $(awk -F"[()]" '{printf "%s ",$4}' file))

echo ${x[2]}
134123

これらのデータをさらに多くの仕事に使用する場合は、awk. 次に、内部配列を使用できますawk

awk -F"[()]" '{x[NR]=$2;y[NR]=$4}' file
于 2013-11-08T17:30:30.337 に答える
2
#!/usr/bin/env bash

x=()
y=()

while read line; do
    x+=("$(sed 's/[^(]*(\([0-9]*\)).*/\1/' <<< $line)")
    y+=("$(sed 's/[^(]*([^(]*(\([0-9]*\)).*/\1/' <<< $line)")
done < "data"

echo "${x[@]}"
echo "${y[@]}"

xy配列として宣言されています。次に、入力ファイルをループして、入力ファイル内のsedすべてのコマンドを呼び出しlineます。

x+=(data)data配列に値を追加しますx。配列に格納したい値を書き込む代わりに、 で行われるコマンド置換を使用します。配列に$(command)の文字通りの意味を追加する代わりに$(command)、コマンドが実行され、その戻り値が配列に格納されます。

sedコマンドを見てみましょう:

's' は代替コマンドです。[^(]*を除くすべてに一致させたい場合(は、 に一致させ(ます。配列に格納したい次の文字は、 と を使用\(して\)、後で再度参照できます ( を使用\1)。番号は と一致し[0-9]*ます。最後に、閉じ括弧)とその他すべてを に一致させます.*。次に、一致したすべて (行全体) を に置き換えます。\1これは、 と の間にあったもの\(です\)

を初めて使用する場合は、構文sedを読むのに時間がかかるため、非常に混乱する可能性があります。sed

2 番目のsedコマンドは非常に似ています。

于 2013-11-08T17:16:14.007 に答える
1

「j」番目の文字列の「i」行の値を抽出し、変数「x」に保存するにはどうすればよいですか?

使ってみてawk

x=$(awk -v i=$i -v j=$j ' NR==i {print $j; exit}' file.dat)

括弧内の数値を抽出し、変数に保存します。たとえば、1 行目の最初の数値は「x1」、同じ行の 2 番目の数値は「y1」、2 行目の「x2」と「y2」などです。 、 等々...

使用するawk

x=($(awk -F'[()]' '{print $2}' file.dat))
y=($(awk -F'[()]' '{print $4}' file.dat))

x1変数の他のシーケンスについても同様に、${x[0]}およびy1としてアクセスできます。${y[0]}

于 2013-11-08T17:29:37.817 に答える