#! /bin/bash
for (( l = 1 ; l <= 50; ++l )) ; do
for (( k = 1 ; k <= 1000; ++k )) ; do
sed -n '$l,$lp' $k.dat >> ~/Escritorio/$l.txt
done
done
スクリプトは、それぞれ50行のテキストで構成される1000個のdatファイルを含むフォルダにあります。
dat ファイル名1.dat
, 2.dat
,....,1000.dat
私の目的は、l行、l行などl.txt
でファイルを作成することです。これを行うには、コマンドを使用して各datファイルに対してlファイルを選択します。l.txt
1.dat
2.dat
sed
しかし、上記のスクリプトを実行すると、生成されたtxtには何も表示されません...
エラーはどこにありますか?
答え1
for LINE in {1..50}; do
for FILE in {1..1000}; do
sed -n "${LINE}p" "${FILE}.dat" >>"~/Escritorio/${LINE}.dat"
done
done
スクリプトはsed式に一重引用符を使用しており、変数は一重引用符内で拡張されないため、二重引用符を使用する必要があります。
同じことを行うawkを含む単一のライナーもあります。
awk 'FNR<=50 {filename=sprintf("results/%d.dat", FNR); print >> filename; close(filename)}' *.dat
~
ホームディレクトリに展開せずに結果ディレクトリを作成するか、コマンドから別のディレクトリに変更します。
答え2
このawkコマンドはどうですか?小さなdatファイルセットを試してください
awk '{file=FNR".txt"; print $0 > file}' *.dat