txt 파일이 너무 많아요. 각 txt 파일의 형식은 다음과 유사합니다.
200 0.2 0.1 0.5 0.4
500 0.4 0.9 0.9 0.1
첫 번째 필드 값이 400보다 큰 각 txt 파일의 모든 행을 삭제하려고 합니다. 따라서 위 파일에는 이제 다음 내용만 포함되어야 합니다.
200 0.2 0.1 0.5 0.4
암호
for file in *.txt; do
echo "$(awk '{ if ($1 < 401) print }' *.txt)" > tmp && mv tmp *.txt
done
rm -f tmp
하지만 이는 모든 파일을 다음 텍스트 파일로 이동시키기 때문에 작동하지 않습니다.
답변1
GNU awk(Linux를 사용하는 경우 거의 확실함)를 사용하는 경우 GNU awk의 내부 편집 라이브러리를 사용할 수 있으며 for
이를 수행하기 위해 쉘 루프나 임시 파일도 필요하지 않습니다.
awk -i inplace '$1 < 401' ./*.txt
이렇게 하면 각 텍스트 파일에서 필드 1 > 400의 모든 줄이 삭제됩니다. 먼저 GNU awk inplace
라이브러리를 로드한 다음 $1 < 401
true로 평가되는 행만 출력하는 방식으로 작동합니다.
awk가 각 원본 파일(예: .bak 파일 확장자)을 변경하기 전에 백업하도록 하려면 awk의 INPLACE_SUFFIX 변수를 사용할 수 있습니다.
awk -i inplace -v INPLACE_SUFFIX=.bak '$1 < 401' ./*.txt
참고: 내부 편집 옵션(예: sed
및 perl
)이 있는 다른 프로그램과 달리 GNU awk의 옵션은 다음 인수에 지정된 gawk 라이브러리를 포함하는 ...ie의 약자입니다. 이 라이브러리("inplace"라고 함)는 내부 편집 기능을 제공합니다.-i
-i
--include
답변2
file
루프 내에서 인용해야 하며 다음을 사용할 필요가 없습니다 echo
.
for file in *.txt; do
awk '{ if ($1 < 401) print }' < "$file" > tmp && mv -- tmp "$file"
done
rm -f tmp
AWK 코드는 다음과 같이 단순화될 수도 있습니다.
for file in *.txt; do
awk '$1 < 401' < "$file" > tmp && mv -- tmp "$file"
done
rm -f tmp
요구 사항을 완전히 충족하려면 테스트를 변경해야 합니다.
for file in *.txt; do
awk '!($1 > 400)' < "$file" > tmp && mv -- tmp "$file"
done
rm -f tmp
답변3
작업을 수행하려면 다음과 같이 코드를 변경할 수 있습니다.
for file in *.txt; do
awk '{ if ($1 < 401) print }' < "$file" > tmp && mv -- tmp "$file"
done
rm -f tmp
그러나 원본 파일을 덮어쓸 때는 주의하십시오. 수정된 파일을 다른 디렉토리(유사한 디렉토리)에 생성하는 것이 더 좋습니다. mv tmp modified/$file
파일을 복사하기 전에 디렉토리를 생성하는 것을 잊지 마십시오.
논리를 "400보다 큼"으로 정의하는 경우 다음과 if
같아야 합니다 $1 <= 400
(숫자는 400.1이 될 수 있음).