다른 내부의 For 루프가 작동하지 않습니다

다른 내부의 For 루프가 작동하지 않습니다
#! /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.txt1.dat2.datsed

그런데 위의 스크립트를 실행하면 생성된 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

관련 정보