텍스트 파일 각 줄의 특정 지점에서 텍스트 편집

텍스트 파일 각 줄의 특정 지점에서 텍스트 편집

다음과 같은 9자리 숫자 목록이 포함된 텍스트 파일이 있습니다.

550411876
550425175
550426504

두 번째 텍스트 파일에는 다음 줄이 포함되어 있습니다.

09Y20171031    13415520171031    134155AP|AO|ABxxxxxxxxx|AC|CH|BIN|

xxxxxxxxx두 번째 파일에 여러 번 나타나지만 첫 번째 파일의 숫자로 대체되는 줄이 포함된 텍스트 파일을 만들어야 합니다 ( xxxxxxxxx말 그대로 파일에 있으므로 이는 단순한 예가 아닙니다). 이 경우 결과는 다음과 같습니다.

09Y20171031    13415520171031    134155AP|AO|AB550411876|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550425175|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550426504|AC|CH|BIN|

Linux에서 이 작업을 어떻게 수행합니까?

답변1

숫자가 파일에 있고 numbers사용하려는 템플릿 파일이 다음과 같다고 가정합니다 file.

awk -F'|' -v OFS='|' 'NR==FNR { n[++i] = $0; next } { for (i in n) { $3 = substr($3,1,2) n[i]; print } }' numbers file

그러면 먼저 숫자를 배열로 읽은 다음 n템플릿 파일의 경우 세 번째로 |구분된 필드의 처음 두 문자를 사용하여 배열의 숫자와 연결하고 n각 숫자에 대해 결과를 한 번씩 인쇄합니다.

이러한 옵션을 사용하면 -구분된 방식으로 데이터를 읽고 쓸 수 -F'|' -v OFS='|'있습니다 .|

그런 다음 출력을 새 파일로 리디렉션합니다.

이는 포함을 위해 템플릿에 의존하지 않습니다 xxxxxxxxx.

테스트해보세요:

$ cat file
09Y20171031    13415520171031    134155AP|AO|AB something something|AC|CH|BIN|

$ awk -F'|' -v OFS='|' 'NR==FNR { n[++i] = $0; next } { for (i in n) { $3 = substr($3,1,2) n[i]; print } }' numbers file
09Y20171031    13415520171031    134155AP|AO|AB550425175|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550426504|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550411876|AC|CH|BIN|

bash9 -es만 사용하는 방법(외부 유틸리티 없음) x:

template=$(<file)
while read number; do
    printf '%s\n' "${template//xxxxxxxxx/$number}"
done <numbers

답변2

분명히 템플릿에는 한 줄만 있습니다 ...

이것이 사실이라면 우리는 할 수 있다

for a in $(< list)
do
    printf "09Y20171031    13415520171031   134155AP|AO|AB%s|AC|CH|BIN|\n" $a
done

답변3

다른방법:

awk 'NR==FNR{ a[++c]=$1; next }
     { for(i in a) { r=$0; sub(/x{9}/,a[i],r); print r } }' file1 file2
  • a[++c]=$1- file1배열에서 숫자 캡처a

  • for(i in a)- 반복아홉 자리

  • sub(/x{9}/,a[i],r)- 키 시퀀스를 xxxxxxxxx다음으로 대체합니다.다음포함된 수량a[i]


산출:

09Y20171031    13415520171031    134155AP|AO|AB550411876|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550425175|AC|CH|BIN|
09Y20171031    13415520171031    134155AP|AO|AB550426504|AC|CH|BIN|

답변4

Perl은 여기서 빠질 수 없습니다.

p=$(< pat) perl -nlE'$l = $ENV{p}; $n=$_; $l =~ s/x{9}/$n/; say $l if /./' nums

pat스키마 파일 이름입니다

p패턴을 전달하는 환경 변수입니다.

n각 반복의 숫자를 포함하는 Perl 변수입니다.

l라인 포함(먼저 각 라인의 패턴, 그 다음 교체 후 인쇄될 실제 라인)

nums숫자 파일 이름입니다

관련 정보