![텍스트 파일 형식을 지정하는 SED 명령](https://linux55.com/image/5466/%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%20%ED%98%95%EC%8B%9D%EC%9D%84%20%EC%A7%80%EC%A0%95%ED%95%98%EB%8A%94%20SED%20%EB%AA%85%EB%A0%B9.png)
아래에 언급된 조건으로 입력 파일을 수정하려면 SED 명령을 생성해야 합니다.
아래와 같은 입력 파일이 있습니다.
항목 목록
Rad# ; ID_KEY ; UNIT_ID
1 ; 30000000004 ; 8417920
2 ; 30000000004 ; 8170811
︙
10 ; 30000000004 ; 1581292
︙
1001 ; 3000000000 ; 8285052
이 파일로 수행해야 할 작업은 다음과 같습니다.
- 첫 번째 줄을 완전히 제거하십시오.
- 두 번째와 세 번째 숫자 집합만 쉼표로 구분하여 유지하세요.
,DATABASE
각 줄 끝에 문자열을 추가합니다.
출력은 아래와 같아야 합니다.
항목 목록
30000000004,8417920,DATABASE
30000000004,8170811,DATABASE
답변1
질문의 출력이 원하는 출력이라고 가정하면 이를 시도해 볼 수 있습니다.
awk -F';' 'BEGIN{OFS=",";} NR>1{gsub(/ /,""); print $2,$3,"DATABASES"}' filename | sed -e :a -e '$!N;s/\n/,/;ta'
어쩌면 그게 유일한 방법일지도 모릅니다 awk
. sed
줄을 같은 줄에 두려면 해당 섹션을 삭제하세요.
SE는 교육적인 목적을 갖고 있는 것 같으므로 위 명령에서 각 플래그의 역할을 설명하겠습니다.
-F';'
;
# 다음으로 사용 --field-separator
BEGIN {OFS=",";}
# 이것은 후속 명령 이전에 실행되는 특수 모드이며 해당 출력은 프로그램의 나머지 부분에 영향을 받지 않습니다. 그럼 우리는ORS
ORS
# 출력에는 쉼표가 포함되어야 하므로 쉼표를 값으로 ,
정의합니다 . Output Record Separator
기본값 ORS
은 개행입니다."\n"
NR>1
# 여기서는 첫 번째 레코드를 건너뛴다고 말합니다. NR
총 입력 레코드 수를 저장하는 데 사용되는 특수 예약 변수이기도 합니다.
gsub()
#은 일부 매개변수를 허용하는 함수입니다. 예 $2
를 들어 필드가 지정되지 않은 경우 $3
then gsub()
함수는 전체 레코드를 사용합니다.$0
마지막으로 지정된 필드가 인쇄되어 줄 끝에 print $2,$3,"DATABASE"
추가됩니다 .DATABASE
print $2,$3
# 여기서는 쉼표를 사용하여 필드를 구분합니다. 기본 FS (Field separator)
구분 기호는 단일 공백입니다 ' '
.
이 간략한 설명으로 몇 가지 사항이 명확해졌기를 바랍니다.
답변2
나는 당신이 (질문의 첫 번째 버전에서와 같이 모두 한 줄에 함께 실행되는 대신) 헤더 뒤의 각 입력 줄을 출력 줄로 변환하기를 원한다고 가정합니다.
sed
작업에 매우 좋은 도구로 사용할 수 있습니다.
sed -e 1d -e "s/.* ; \(.*\) ; \(.*[^ ]\) */\1,\2,DATABASE/"파일 이름
어디
1d
첫 번째 행을 삭제한다는 의미이며,-
s/.* ; \(.*\) ; \(.*[^ ]\) */\1,\2,DATABASE/
즉, 첫 번째 줄 이후의 각 줄을 분리한 다음 제외되는 해당 부분의 후행 공백으로 바꿉니다.
something1 ; something2 ; something3
something2,something3,DATABASE
.*[^ ]
something3
답변3
의견에서와 같이 awk 솔루션은 다음과 같습니다.
awk '{ FS=";"; OFS=","; gsub(/^[ \t]+/, "", $2); gsub(/[ \t]+$/, "", $2); gsub(/^[ \t]+/, "", $3); gsub(/[ \t]+$/, "", $3); } NR > 1 { print $2, $3, "DATABASE" }' file
답변4
나는 이것을 할 수 있습니다 :
cut -d' ' -f3,5 <infile |
sed -n 'y/ /,/;1!s/$/,DATABASE/p'
...저는 이것이 아마도 이 문제에 대한 가장 효율적인 해결책이라고 생각하기 때문입니다.