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

관련 정보