첫 번째 필드 값이 400보다 큰 경우 각 텍스트 파일의 행을 삭제합니다.

첫 번째 필드 값이 400보다 큰 경우 각 텍스트 파일의 행을 삭제합니다.

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 < 401true로 평가되는 행만 출력하는 방식으로 작동합니다.

awk가 각 원본 파일(예: .bak 파일 확장자)을 변경하기 전에 백업하도록 하려면 awk의 INPLACE_SUFFIX 변수를 사용할 수 있습니다.

 awk -i inplace -v INPLACE_SUFFIX=.bak '$1 < 401' ./*.txt

참고: 내부 편집 옵션(예: sedperl)이 있는 다른 프로그램과 달리 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이 될 수 있음).

관련 정보