대용량 .txt 파일이 여러 개 있고 길이가 정확히 9자인 경우 줄을 삭제해야 합니다. 그 이상도 이하도 아닌.
awk/sed를 사용하여 이를 수행할 수 있는 방법이 있습니까?
답변1
sed
GNU 의 확장 정규식을 사용하세요 :
for file in ./*.txt; do
sed -i -r '/^.{9}$/d' "${file}"
done
(대신 FreeBSD/macOS에서 사용하고 -E
(최신 버전의 GNU에서도 작동함) 대신)-r
-E
sed
-i ''
-i
지적한대로돈 크리스티, GNU를 사용하면 sed
반복할 필요가 없습니다.
sed -s -i -r '/^.{9}$/d' ./*.txt
답변2
그리고 awk
:
for f in ./*.txt; do
awk 'length($0) != 9' "$f" >"destdir/$f"
done
그리고 sed
:
for f in ./*.txt; do
sed '/^.\{9\}$/d' "$f" >"destdir/$f"
done
그리고 grep
:
for f in ./*.txt; do
egrep -vx '.{9}' "$f" >"destdir/$f"
done
답변3
이것은 효과가 있을 수 있습니다:
grep -vE '^.{9}$' filename > new_filename
9를 원하는 문자로 전환하세요.
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
-E, --extended-regexp
Interpret PATTERN as an extended regular expression (ERE, see
below).
.
{9}
이 패턴이 9번 일치함을 나타내는 임의의 문자를 나타냅니다 . ^
줄의 시작을 나타내고 $
줄의 끝을 나타냅니다.
답변4
for i in *.txt
do
egrep -v '^.........$' <"$i" >destdir/"$i"
done
sed
또는 대신 사용을 고집하는 경우 egrep
:
for i in *.txt
do
sed '^.........$/d' <"$i" >destdir/"$i"
done
235자 길이의 줄을 삭제하려면 다음 안내를 따르세요.
X=""
for i in `seq 1 235`
do
X="$X."
done
for i in *.txt
do
egrep -v '^'"$X"'$' <"$i" >destdir/"$i"
done
단순함 그 자체!