awk에서 패턴을 복사하여 다음 줄에 붙여넣습니다.

awk에서 패턴을 복사하여 다음 줄에 붙여넣습니다.

내 폴더에는 txt 파일이 많이 있습니다. 각 파일에는 이 형식의 한 줄이 포함되어 있습니다.

8852 0.53451 0.55959 0.65494 0.36047

다음 행에 고정 숫자를 추가하고 나머지 4개 열은 아래와 같이 원래 행에서 복사됩니다.

8852 0.53451 0.55959 0.65494 0.36047

9997 0.53451 0.55959 0.65494 0.36047

지금까지 폴더 내부의 명령을 수행하여 9997을 추가했습니다.

find *.txt -exec sh -c 'echo "9997" >> $0' {} \;

나머지 4개 열을 복사했습니다.

for files in .; do awk '{$1=""; print substr($0,2)}' *.txt;done

그러나 각 파일의 다음 줄이 아닌 출력에 인쇄됩니다.

아직 다 정리하지도 못하고 가까워진 것 같은 느낌도 들지만 아마도 잘못된 방향일지도 모르겠습니다. 나는 awk '{print "\n"$2,$3,$4,$5}' 를 시도했지만 역시 작동하지 않았습니다.

도움을 주시면 감사하겠습니다! 감사해요.

답변1

나는 추천한다awk '{print; $1 = 9997; print}'

$ echo '8852 0.53451 0.55959 0.65494 0.36047' | awk '{print; $1 = 9997; print}'
8852 0.53451 0.55959 0.65494 0.36047
9997 0.53451 0.55959 0.65494 0.36047

여러 파일에 변환을 적용한다고 언급하셨습니다. 루프를 사용하여 이 작업을 수행할 수 있습니다.

for f in *.txt; do  awk '{print; $1 = 9997; print}' "$f"; done

또는 (재귀적으로) 사용find

find . -name '*.txt' -exec awk '{print; $1 = 9997; print}' {} \;

그러나 확장자가 .인 최신 버전의 GNU Awk가 없으면 -i inplace결과가 연결되어 표준 출력에 기록됩니다.

답변2

주어진귀하의 의견파일을 업데이트하려는 경우 in this directory and other directories next to it.수정하려는 파일이 있는 다른 디렉터리가 있는 디렉터리가 있다고 가정해 보겠습니다. 최상위 디렉토리로 CD를 복사한 후 수행하는 방법은 다음과 같습니다.

find . -maxdepth 2 -mindepth 2 -exec awk -i inplace '{print} $1==8852{$1=9997; print}' {} +

위의 내용은 "내부" 편집을 위해 GNU awk를 사용하고 이를 위해 GNU find를 사용합니다 +. GNU 도구가 없으면 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다.

tmp=$(mktemp)
while IFS= read -r file; do
    awk '{print} $1==8852{$1=9997; print}' "$file" > "$tmp" &&
    mv "$tmp" "$file"
done < <(find . -maxdepth 2 -mindepth 2) )
rm -f "$tmp"

8852다음을 포함하지 않는 파일의 타임스탬프를 변경하고 싶지 않은 경우 :

tmp=$(mktemp)
while IFS= read -r file; do
    awk '$1==8852{f=1; exit} END{exit !f}' "$file" &&
    awk '{print} $1==8852{$1=9997; print}' "$file" > "$tmp" &&
    mv "$tmp" "$file"
done < <(find . -maxdepth 2 -mindepth 2) )
rm -f "$tmp"

답변3

따라서 많은 파일이 있고 다음 형식의 줄이 있습니다.

8852 0.53451 0.55959 0.65494 0.36047

이제 파일을 열고 첫 번째 열을 선택한 값으로 바꾸고 나머지는 그대로 두고 다음 행에 추가하려고 합니다.

8852 0.53451 0.55959 0.65494 0.36047

9997 0.53451 0.55959 0.65494 0.36047

질문에 올바르게 대답했다면 다음이 작동할 것입니다.

for file in ``find . -name "*.txt"``; do awk '{print "\n9997 "$2,$3,$4,$5}' $file >> $file; done

폴더의 모든 파일을 가져오고 awk를 사용하여 파일을 읽고 2345개의 열을 가져온 다음 첫 번째 열에 대한 값을 추가하고 동일한 파일에 추가합니다.

제가 질문을 잘못했다면 사과드립니다.

관련 정보