쉘 스크립트는 한 파일의 행 번호를 일치시키고 일치하면 다른 파일에 주석으로 배치합니다.

쉘 스크립트는 한 파일의 행 번호를 일치시키고 일치하면 다른 파일에 주석으로 배치합니다.

두 개의 파일이 있습니다. 두 파일의 내용은 동적이며 필요할 때 시스템에 의해 생성됩니다.

첫 번째 파일에는 다음과 같은 의미를 갖는 특정 줄 번호가 포함되어 있습니다.

head simdb.txt 
MSISDN
Account_ID
COSP_ID
Currency
Language
Home_Zone
SIM_PIN
Screening_PIN
Third_ParAnothercess_PIN
Cumulative_Incorrect_PIN

다른 파일에는 다음과 같은 동적 데이터가 포함되어 있습니다.

head subscriber.txt
0='917598936722' 4='ENG' 6='1234'

출력은 다음과 같아야 합니다.

0='917598936722'  //MSISDN
4='ENG'           //Language
6='1234'          //SIM_PIN

질문이 업데이트되었습니다 ========

위의 쿼리에 추가하여 subscriber.txt에 여러 줄이 있는 경우 스크립트가 먼저 줄을 인쇄한 다음 원하는 출력을 인쇄하도록 하려면 어떻게 해야 합니까? 예를 들어, 다음과 같은 subscriber.txt 파일이 있는 경우

head subscriber.txt
0='917598936722' 4='ENG' 6='1234'
0='919654680634' 4='ENG' 6='1234'

그러면 원하는 출력은 다음과 같습니다.

0='917598936722' 4='ENG' 6='1234'

0='917598936722'  //MSISDN
4='ENG'           //Language
6='1234'          //SIM_PIN

===========================================

0='919654680634' 4='ENG' 6='1234'

0='919654680634'  //MSISDN
4='ENG'           //Language
6='1234'          //SIM_PIN

답변1

awk 'NR==FNR
    {Arr[NR-1]=$0;
    next}
    {for(i=1;i<=NF;i++)
    {split($i,a,"="); 
    print $i "    //"Arr[a[1]]}
    }'simdb.txt subscriber.txt
  • simdb.txt의 모든 줄을 읽고 배열에 보관합니다. 인덱스는 0부터 시작
  • 두 번째 파일을 읽고 등호 앞의 값이 무엇인지 확인하세요.
  • Arr에서 값을 읽고 인쇄합니다.

답변2

awk 'FNR==NR { for (i=1; i<=NF; ++i) {
                   split($i, a, "=")
                   s[a[1]+1] = $i }; next }
     FNR in s { printf("%-20s//%s\n", s[FNR], $0) }' subscriber.txt simdb.txt

먼저 더 짧은 파일의 필드를 읽고 subscriber.txt해당 값을 배열에 할당합니다 s. 배열 s은 각 필드 앞의 숫자 =(1 더하기)로 입력됩니다.

파일을 읽을 때 simdb.txt파일의 줄 번호가 테스트됩니다. 해당 줄 번호가 배열의 키인 경우 s원하는 출력이 생성됩니다. 출력은 왼쪽으로 정렬된 문자열(데이터)에 20자를 할당하고 그 뒤에 해당 특정 행에 대해 보유된 데이터를 할당하는 printf형식화된 문자열을 통해 수행 됩니다.simdb.txt//subscriber.txt

질문의 데이터 출력을 제공합니다.

0='917598936722'    //MSISDN
4='ENG'             //Language
6='1234'            //SIM_PIN

관련 정보