#! /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.txt
私の目的は、l.txt
の l 行1.dat
、 の l 行などが含まれるファイル を作成することです2.dat
。そのためには、sed
コマンドを使用して、各 dat ファイルの l ファイルを選択します。
しかし、上記のスクリプトを実行すると、作成された 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