설명하다

설명하다

나는 이 학생의 정보를 처리하고 있습니다:

name: Romeo
e_mail: [email protected]
Room: 0/48
street: 1/0/48

name: April
e_mail: [email protected]
Room: 0/4
street: 1/0/4

name: Julian
e_mail: [email protected]
Room: 0/2
street: 1/0/2

name: Charles
e_mail: [email protected]
Room: 0/1
street: 1/0/1

name: Chris
e_mail: [email protected]
Room: 0/42
street: 1/0/42

name: Richard
e_mail: [email protected]
Room: 0/6
street: 1/0/6

이 .csv 파일도 있습니다.

id,name,e_mail
st0001, Romeo, [email protected]
st0002, Julian, [email protected]
st0003, Chris, [email protected]
st0004, Richard, [email protected]

.csv 파일에서 ID를 가져와서 다음과 같이 .dat 파일에 추가하고 싶습니다.

name: Romeo
e_mail: [email protected]
Room: 0/48
street: 1/0/48
id: st0001    

name: April
e_mail: [email protected]
Room: 0/4
street: 1/0/4

name: Julian
e_mail: [email protected]
Room: 0/2
street: 1/0/2
id: st0002

name: Charles
e_mail: [email protected]
Room: 0/1
street: 1/0/1

name: Chris
e_mail: [email protected]
Room: 0/42
street: 1/0/42
id: st0003

name: Richard
e_mail: [email protected]
Room: 0/6
street: 1/0/6
id: st0004

지금까지 나는 이것을 시도했습니다 :

#!/bin/bash

    FILE1=students.dat
    FILE2=table.csv

    while read line; do
        if [[ $line == name* ]]; then
            echo -e "\n$line"
            expectIp=1
        elif [[ $line == *e_mail* && $expectIp -eq 1 ]]; then
            sed 's/^\s*//' <<< $line
            unset expectIp
        elif [[ $line == Room* ]]; then
            Room=$(echo $line | grep -o 'Room[^,]*,' | sed 's/,//')
            echo $Room
            echo $line | grep -o 'street*'
            justRoom=$(echo $Room | sed 's/Room: //')
            grep -A1 \"$justRoom\" $FILE2 | grep -o 'id'
        fi
    done < $FILE1

최종 스크립트에는 오류가 많았습니다.

.csv 파일에서 ID를 얻는 방법을 찾았습니다.

grep  "[email protected]" students.csv | awk -F "\"*,\"*" '{print $1}'

.dat 파일에 자동으로 추가하려면 어떻게 해야 합니까?

답변1

perl -F',\s+' -lane '
   @ARGV and $h{$F[1]}=$F[0],next;

   /^name:\s+(\S+)/ && exists $h{$a=$1} .. /^$/ || eof and do{
      /^$/ || eof and $_ .= (/^$/ ? $, : $\) . ("id: " . $h{$a} // "") . (eof ? $, : $\);
   };

   print;
' table.csv students.dat

설명하다

Perl옵션

  • -F필드 구분 기호는 다음과 같이 설정됩니다.,\s+
  • -l출력 레코드 구분 기호는 다음과 같이 설정됩니다.\n
  • -a자동 분할 모드 => 배열에 @F필드가 포함됨$1,$2,...,$NF
  • -n필요한 경우에만 인쇄 + 암시적으로 행 읽기, a.la.awk

논리

  • 매개변수의 순서는 .csv 파일, 그 다음 .dat 파일입니다.
  • @ARGV and=> 고려되는 입력 파일이 .csv인 경우 otw .dat
  • .csv 파일 데이터에서 키를 이름으로, 값을 ID로 해시 %h를 채웁니다.
  • 이제 .dat 파일을 처리할 때 여기에서 작업이 수행됩니다.
  • 에서는 트리거 연산자 a.la 가 있습니다 Perl. 그러나 입력에 더 많은 조건을 추가 할 수 있다는 점에서 이는 더 일반적입니다 . 특히, 이 예에서는 줄이 이름:으로 시작하고 그 뒤에 여러 개의 공백이 오는 경우 조합이 형성되고, 학생 이름을 캡처하고 $h{$a=$1} 해당 학생 이름이 TRUE 값으로 발견되었는지 테스트합니다 . (참고: 따라서 => ID가 0이면 오류가 발생합니다!) 이 단계가 수행되면 연산자는 true로 유지되며 빈 행이 보이거나 를 클릭할 때까지 이 작업을 계속합니다 . 이 특정 단계에서는 현재 행을 해시의 ID 데이터로 채웁니다.condition1 .. condition2,sed../^name:\s+(\S+)/ && $h{$a=$1}cond1flip-flopEOF$_

관련 정보