ループ内の別のループは機能しません

ループ内の別のループは機能しません
#! /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

関連情報