파일에서 줄을 제거하는 데 문제가 있습니다. 내 프로그램은 while 및 if 루프를 사용하여 특정 조건을 확인하고 일치하는 경우 파일에서 해당 줄을 삭제합니다. 하지만 삭제하는 동안 "sed: can read"와 같은 오류가 발생합니다. 나는 해결책에 가깝다고 생각하지만 그것을 알아낼 수는 없습니다. 아래는 내가 사용하는 코드입니다.
#!/bin/ksh
File='dsgp_p50.dat'
cd /home/lpadmin
while read -r line
do
x=`echo "$line" | cut -c 75-104`
echo $x
if [ $x == '00000000000000+00000000000000+' ]
then
sed '1,1d' "$line" > vikas.dat
fi
done < $File
고쳐 쓰다:
다음 형식의 데이터가 포함된 파일이 있습니다.
507425B30 171013D248900022 4057-ACCR PROPERTY TAX
00000000257910+00000000000000+00000000257910+00000000000000+00000000000000+
507425B30 171013C249999092 1071-DO NOT USE
00000000000000+00000000000000+00000000000000+00000000031940+00000000000000+
이제 00000000000000+00000000000000+ 등의 패턴이 포함된 줄을 삭제해야 합니다. (파일의 패턴 위치는 75-104입니다.) 까다로운 부분은 같은 줄에 처음 나타날 때만 줄을 삭제해야 한다는 것입니다. . 위의 첫 번째 레코드와 같이 패턴이 끝에 나타나고 해당 줄을 파일에서 제거해서는 안 되는 경우가 있습니다. 이 행은 00000000000000+00000000000000+ 패턴이 위치 75-104에서 발생하는 경우에만 삭제되어야 합니다.
답변1
sed
당신을 위한 몇 가지 팁:
while read
파일을 반복하고 또는 내부적으로 사용하는 것은 해당 도구가 어쨌든 파일을 한 줄씩 처리하도록 설계되었으므로sed
거의 의미가 없습니다 .awk
의 주소 범위
sed '1,1d'
가 중복됩니다. 단일 라인을 처리하려면sed '1d'
범위를 사용하지 않고도 처리할 수 있습니다. 이 경우 어쨌든 한 줄만 있는데 삭제된 줄이 파일로 리디렉션되는 이유는 무엇입니까?에서는 파일 이름
sed '1,1d' "$line"
이$line
될 것으로 예상됩니다!그래서 당신이 해야 할 일은 매우 간단합니다
sed '/find the right regexp/d' $File
.줄의 75ff 위치에 있는 지정된 문자열과 일치하는 패턴은
/^.\{74\}00000000000000+00000000000000+/
(즉, 줄의 시작 ( )^
, 그 뒤에 임의의 74개 문자 및 패턴이 옵니다.위에 주어진
\{number\}
일부 중복 항목을 사용하면 다음과 같이 단순화할 수 있습니다./^.\{74\}0\{14\}+0\{14\}+/
이제 반복되는 시퀀스를 그룹화하여 더욱 단순화할 수 있습니다.
\(sequence\)\{2\)
이제 백슬래시 이스케이프를 방지하기 위해 확장 정규식을 사용하면 전체 스크립트를 간단한 코드로 바꿀 수 있습니다.
sed -E '/^.{74}(0{14}\+){2}/d' $File