각 열 뒤에 쉼표를 추가하는 방법은 무엇입니까?

각 열 뒤에 쉼표를 추가하는 방법은 무엇입니까?

Excel에서 .csv를 열 때 각 열에 자체 탭이 있도록 하려면 이것이 필요합니다.

내 텍스트는 다음과 같습니다.

smmsp              Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT                            n    Account expires : never
samba              Purpose - Service account for Samba; Owner - sysadmin; SERVICE ACCOUNT                               n    Account expires : never
puppet             Purpose - Service account for Puppet; Owner - sysadmin; SERVICE ACCOUNT                              n    Account expires : never

나는 이것이 필요하다:

smmsp,              Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT,                            n,    Account expires : never,
samba,              Purpose - Service account for Samba; Owner - sysadmin; SERVICE ACCOUNT,                               n,    Account expires : never,
puppet,             Purpose - Service account for Puppet; Owner - sysadmin; SERVICE ACCOUNT,                              n,    Account expires : never,

출력을 파이핑하려고 시도했지만 awk 'gsub(" ", ",", $1)' FS=, OFS=,모든 공백이 쉼표로 대체되었습니다.

답변1

입력 파일이 고정 너비 형식인 것 같습니다. Excel에서 열어 수정하지 않고도 각 열의 위치를 ​​지정할 수 있어야 합니다.

그러나 입력 예의 모든 필드에는 최소 2개 이상의 공백이 포함된 것으로 나타나므로 2개 이상의 공백이 있는 모든 항목을 쉼표로 바꿀 수 있습니다.

sed -r 's/  \+/,/g' input.txt

지침:

  • 위의 내용 -r에는 GNU의 sed에서 사용할 수 있는 확장 정규 표현식( )이 필요합니다.
  • 텍스트 필드가 고정 너비 필드를 채울 만큼 길거나 공백이 하나만 남으면 쉼표가 삽입되지 않습니다.

고정 너비 필드 끝에 쉼표를 넣은 다음 추가 공백을 제거하는 또 다른 방법이 있습니다. 이 예에서 고정 너비 필드의 너비는 입력 예를 기반으로 합니다.

sed 's/\(.\{19\}\)\(.\{101\}\)\(.\{5\}\)/\1,\2,\3,/' columns.txt | sed 's/ *,/,/g'

후자의 접근 방식은 정규식을 확장할 필요가 없으며 항목이 전체 고정 너비 필드를 채우는 경우에도 작동합니다.

답변2

내부 간격을 유지하려는 것 같으므로 @cherdt의 솔루션과 비슷한 작업을 수행하지만 다음과 같은 것을 캡처할 수 있습니다.

sed -e 's/\(  \+\)/,\1/g' input

이렇게 하면 공백 수를 변경하지 않고 2개 이상의 공백으로 구성된 각 블록 앞에 쉼표가 배치됩니다.

답변3

열이 탭으로 구분되어 있으면(다음과 같이 표시됨) 다음과 같이 작동합니다.

$awk -F "[\t]*" '{print $1", "$2", "$3", "$4", "}' b.txt
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never, 

열이 탭이 아닌 공백으로 구분된 경우 공백을 구분 기호로 사용하면 데이터 사이에도 공백이 있으므로 약간 혼란스러울 수 있습니다.

파일을 읽고 다음과 같은 배열에 저장합니다.

$while IFS=" " read -a line;do for i in {0,11,12,16};do line[$i]+=",";done;echo "${line[@]}";done <b.txt
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,
smmsp, Purpose - Service account for Sendmail; Owner - sysadmin; SERVICE ACCOUNT, n, Account expires : never,

공간 분리 측면에서 배열 요소 line[0], line[11], line[12] 및 line[16]에 쉼표를 추가해야 한다는 것을 알았습니다.

이 트릭을 사용하려면 모든 행의 형식이 동일해야 합니다.
그렇지 않은 경우 각 배열 요소를 읽고 원하는 위치에 쉼표를 삽입해야 합니다.

행이 많고 성능을 중요하게 생각하는 경우 awk 스크립트를 작성하여 모든 변수($1부터 $NF까지)를 비슷한 방식으로 처리할 수 있지만 awk 스크립트 내부에서는(저는 awk를 잘 못합니다..)

관련 정보