![シェルスクリプトを使用して2列のファイルを書き込む](https://rvso.com/image/154447/%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A62%E5%88%97%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%82%80.png)
変数を 2 列以上 (echo
例を使用して) で出力ファイルに印刷するにはどうすればよいでしょうか。次のものがあります。
grep -oP 'value\s*=\s*\K.*' file >x_vs_y # x values
for X in $(seq 0 50 400)
do
echo "$X" >>x_vs_y # y values
done
出力: (x_vs_y)
1.08759432363
1.08477216702
1.08211988431
1.07947977045
1.07685185457
1.07423631941
1.07163282502
1.06904156798
1.06646245052
0
50
100
150
200
250
300
350
400
このスクリプトを使用すると、出力ファイルは 1 列 (18x1) になりますが、次のような 9x2 配列 (X 対 Y) を取得したいのです。
出力: (x_vs_y)
1.08759432363 0
1.08477216702 50
1.08211988431 100
1.07947977045 150
1.07685185457 200
1.07423631941 250
1.07163282502 300
1.06904156798 350
1.06646245052 400
答え1
次の入力ファイルを考えてみましょう:
$ cat file
value = 1.08759432363
value = 1.08477216702
value = 1.08211988431
value = 1.07947977045
value = 1.07685185457
value = 1.07423631941
value = 1.07163282502
value = 1.06904156798
value = 1.06646245052
2 列を印刷するには:
$ awk '{print x+0, $3; x+=50}' file
0 1.08759432363
50 1.08477216702
100 1.08211988431
150 1.07947977045
200 1.07685185457
250 1.07423631941
300 1.07163282502
350 1.06904156798
400 1.06646245052
出力をファイルに保存する
$ awk '0==a[$0]++' file >outfile
$ cat outfile
value = 1.08759432363
value = 1.08477216702
value = 1.08211988431
value = 1.07947977045
value = 1.07685185457
value = 1.07423631941
value = 1.07163282502
value = 1.06904156798
value = 1.06646245052
答え2
paste
とを組み合わせると、もっとseq
シンプルになるかもしれません:
paste datafile <( seq 0 50 $(( ($(wc -l datafile | cut -d' ' -f1 )-1)*50 )) ) > output
最後の値は、seq
入力データファイル内の行番号に基づいています。