다음 형식의 CSV 파일이 있습니다( ;
구분 기호).
KEY;..;..;..;..;id1;..;..
SUBKEY;..;..
SUBKEY;..;..
SUBKEY;..;..
KEY;..;..;..;..;id2;..;..
SUBKEY;..;..
SUBKEY;..;..
SUBKEY;..;..
id
로 시작하는 각 행에서 (열 6)을 가져 KEY
와서 로 시작하는 다음 행에 추가 해야 합니다 SUBKEY
. 따라서 결과는 다음과 같아야 합니다.
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id2
SUBKEY;..;..;id2
SUBKEY;..;..;id2
Bash 스크립트에서 이를 수행하는 방법을 아시나요?
답변1
Awk
해결책:
awk 'BEGIN{ FS = OFS = ";" }
$1 == "KEY"{ id = $6; next }
{ print $0 (NF? OFS id : "") }' file.csv
FS = OFS = ";"
-;
필드 구분 기호(FS
) 및 출력 필드 구분 기호(OFS
) 로 처리됩니다.$1 == "KEY"{ id = $6; next }
- 첫 번째 필드가$1
여섯 번째 필드의"KEY"
문자열 세트 변수 와 동일한 경우. 다음 레코드로 강제 이동합니다(현재 레코드 건너뛰기).id
$6
next
awk
print $0 (NF? OFS id : "")
- 레코드에 필드가 있는$0
경우 ( 내장 변수로 보장) 전체 레코드를 인쇄/출력합니다. 즉, 레코드가 비어 있지 않은 경우 - 레코드 끝에 (as ) 및 현재 값을 추가합니다.NF
;
OFS
id
산출:
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id1
SUBKEY;..;..;id2
SUBKEY;..;..;id2
SUBKEY;..;..;id2
답변2
옆해결책:
sed -E '/^KEY/{s/([^;]*;){5}([^;]*).*/\2/;h;d};/;/{G;s/\n/;/}' file.csv
- /^키/{s/([^;];){5}([^;]).*/\2/;h;d}
행이 KEY로 시작하는 경우 6번째 필드를 예약된 공간에 유지하고 행을 삭제합니다.
- /;/{G;s/\n/;/}
줄에 필드가 포함되어 있으면 끝에 예약된 공간을 확보하고 \n을 ;로 바꾸세요.
답변3
나는 이것을 수행하여 문제를 해결했습니다 sed -r 's|^(\S+)(\s+\S+)$|s/^\1.*/\&\2/p|' sed -nf - 파일 1
이제 서버가 위치한 ESX의 이름이 포함된 CSV 파일에 열을 추가해야 하는 문제에 직면했습니다. 다른 파일의 조건부 검색을 기반으로 csv에 필드 추가