나는 이 학생의 정보를 처리하고 있습니다:
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}
cond1
flip-flop
EOF
$_