여러 키로 입력된 파일에서 값 추출

여러 키로 입력된 파일에서 값 추출

pair 가 포함된 파일을 생각해 보세요 key=value. 각각은 key여러 s의 연결일 수 있습니다. key즉, 여러 개의 key가 하나의 에 매핑될 수 있습니다 value. 그 이유는 key각 단어가 길이에 비해 상대적으로 짧은 단어이므로 value데이터가 더 적은 수의 줄로 "압축"되기 때문입니다.

예시(즉, 실제 값이 아님):

$ cat testfile
AA,BB,CC=a-lengthy-value
A,B,C=a-very-long-value
D,E,F=another-very-long-value
K1,K2,K3=many-many-more
Z=more-long-value

모든 keys가 고유하고 다음 문자를 포함하지 않는다고 가정하면 유효합니다.

  • key분리 기호:,
  • 키 값 구분 기호:=
  • 공백 문자:

keys는 어떤 형태로든 나타날 수 있습니다.미래(위의 제약 조건에 따라)지금또한 다음 정규 표현식을 준수합니다 [[:upper:]]{2}[[:upper:]0-9]. 마찬가지로 values는 포함되지 않으므로 ==줄을 분할하는 데 안전하게 사용할 수 있습니다. 여러 줄 key이나 줄이 없기 value때문에 한 줄씩 처리하는 것도 안전합니다.

이 파일에서 데이터를 쉽게 추출하기 위해 getval()다음과 같은 함수가 정의됩니다.

getval() {
    sed -n "/^\([^,]*,\)*$1\(,[^=]*\)*=\(.*\)$/{s//\3/p;q}" testfile
}

따라서 호출은 대신 getval A값을 반환합니다 . 또한 존재하지 않는 항목에 대해서는 아무것도 반환하지 않아야 합니다 .a-very-long-valuea-lengthy-valuekey

질문:

  • 견고성에 대한 현재 정의가 getval()충분합니까?
  • 더 짧고, 더 표현적이고, 더 제한적인 다른 데이터 추출 방법이 있습니까?

어쨌든, 이 스크립트는 cygwin과 함께 실행되며 bash함께 coreutils제공됩니다. 따라서 여기서는 이식성이 필요하지 않습니다(즉, 보너스 포인트만 제공됨). 감사해요!

편집하다:

기능이 수정되고 키에 대한 설명이 추가되었습니다.

편집 2:

서식(여러 줄 없음) 및 이식성(요구 사항 아님)에 대한 참고 사항을 추가했습니다.

답변1

다음을 사용하여 더 읽기 쉬운 형식으로 작성할 수 있습니다 awk.

getval() {
    awk -F'=' '$1~/\<'"$1"'\>/{print $2}' testfile
}

답변2

그리고 sed...

getval() { sed "/^\([^=]*,\)*$1[,=]/!d;s/.*=//;q"; } <infile

그러나 $1입력의 유효성을 검사할 수도 있습니다.

또는 GNU를 사용 grep하고 다음을 수행하십시오 cut.

getval() { grep -Em1 "^([^=]*,)*$1[,=]" | cut -d= -f2-; } <infile

관련 정보