fileA에서 문자열을 찾고, 해당 문자열에서 일부 텍스트를 선택하고, fileB에서 문자열을 바꾸는 방법은 무엇입니까?

fileA에서 문자열을 찾고, 해당 문자열에서 일부 텍스트를 선택하고, fileB에서 문자열을 바꾸는 방법은 무엇입니까?

파일 A와 파일 B가 있습니다. 존재하다파일 A, 내 스크립트가 특정 stringA를 찾을 수 있기를 원합니다. 그런 다음 sed명령을 사용하여 stringA의 일부만 붙여넣습니다.문서 B(특정 stringB의 일부로 대체됨문서 B).

예를 들어.

파일 A
아시지카 허스테드
아시직 다지드
권장 무게:0.546(관심 문자열입니다)

문서 B
아스다 기스크다
크자쉬 자흐스테드
워킹그룹HT      0.495(FILE BI의 교체가 필요한 부분입니다)

stringA(0.546)의 텍스트를 선택하고 fileB의 0.495를 0.546으로 바꾸고 싶으므로 새 fileB는 다음과 같습니다.

새 파일 B
아스다 기스크다
크자쉬 자흐스테드
무게 0.546

sed같은 파일에서 stringA를 stringB로 바꾸지만 내 stringsA와 B가 다른 파일에 있기 때문에 사용하는 것은 나에게 적합하지 않습니다. 또한 "무작위로"(프로그래밍 방식으로) 생성됩니다.

답변1

sed(및 첫 번째 파일과 일치하는 다른 도구)를 사용하여 실제로 이 작업을 수행할 수 있습니다 . 예를 들어:

$ sed -E "s/(WGHT\s*).*/\1$(grep -oP 'Recommended Weight: \K[0-9.]+' fileA)/" fileB 
asdajskdha
kjashdjahsd
WGHT 0.546

또는 먼저 변수에 저장하십시오.

$ wght=$(sed -En 's/Recommended Weight: *([0-9.]+)/\1/p' fileA)
$ sed -E "s/(WGHT\s*).*/\1$wght/" fileB
asdajskdha
kjashdjahsd
WGHT 0.546 

답변2

awk 'FNR==NR && $2 == "Weight:"{ weights[spotted++]=$3} FNR!=NR && $1 != "WGHT" { print } FNR!=NR && $1=="WGHT" { print "WGHT", weights[replaced++]} ' in1 in2 > out2

out2그러면 원하는 출력 데이터가 포함된 새 파일이 생성됩니다 . 그런 다음 원하는 곳으로 이동할 수 있습니다.

$ cat out2
asdajskdha
kjashdjahsd
WGHT 0.546

답변3

이 스크립트는 new_file_b.txt.

용법: ./script.sh file_a.txt file_b.txt > new_file_b.txt

#!/bin/bash

awk '
/Recommended Weight: /{
    value=$3;
}
NR != FNR {
    if($1 == "WGHT") {
        print $1 OFS value; 
    } else {
        print;
    }
}
' "$1" "$2"

답변4

GNU sed다음과 같이 진행할 수 있습니다 :

sed -Ez '
   N;s/.*\nRecommended Weight: (\S+)\n.*\x00(.*\nWGHT[[:blank:]]+)\S+\n/\2\1\n/
' fileA fileB

-E켜져 있으면 extended regex facility-z옵션은 각 파일을 단일 문자열로 처리하고 여러 파일을 \0null( )로 구분합니다.

관련 정보