탭으로 구분된 데이터를 쉼표로 구분된 데이터로 변환하는 방법은 무엇입니까?

탭으로 구분된 데이터를 쉼표로 구분된 데이터로 변환하는 방법은 무엇입니까?

Amazon의 ec2 명령줄 도구를 통해 ec2 스냅샷 목록을 요청합니다.

ec2-describe-snapshots -H --hide-tags > snapshots.csv

데이터는 다음과 같습니다.

SnapshotId      VolumeId        StartTime   OwnerId         VolumeSize  Description
snap-00b66464   vol-b99a38d0    2012-01-05  5098939         160         my backup

데이터를 다음으로 리디렉션하기 전에 어떻게 가로챌 수 있나요 snapshots.csv?

  • "탭"을 쉼표로 바꾸세요
  • 값을 따옴표로 묶습니다.
  • 값이 모두 숫자인 경우 접두사를 붙이면 =Excel에서 이를 텍스트로 처리합니다. 예를 들어 OwnerId" "=5098939(인라인으로 수행할 수 없는 경우 이 접두사가 필요하지 않으며 스크립트 파일이 필요합니다.) 또는 대신 기능)

원하는 출력:

"SnapshotId","VolumeId","StartTime","OwnerId","VolumeSize","Description"
"snap-00b66464","vol-b99a38d0","2012-01-05","=5098939","=160","my backup"

답변1

#!/usr/bin/awk -f

BEGIN { FS = "\t"; OFS = "," }
{
    for(i = 1; i <= NF; i++) {
        if ($i + 0 == $i) { $i = "=" $i }
        else gsub(/"/, "\"\"", $i);
        $i = "\"" $i "\""
    }
    print
}

이 이름을 지정한다고 가정하면 convert.awk다음 중 하나를 사용하여 호출할 수 있습니다.

ec2-describe-snapshots -H --hide-tags | awk -f convert.awk > snapshots.csv

또는 (실행 권한 추가 후 chmod a+x convert.awk)

ec2-describe-snapshots -H --hide-tags | ./convert.awk > snapshots.csv

이렇게 하면 각 탭에 대해 새 열이 생성되어 주석 열이 함께 배치되지만(탭이 포함되지 않은 경우) 빈 열이 추가됩니다(예제 출력이 이와 같으므로 원할 수도 있음). 모든 공백을 분할하려면(테이블의 추가 탭이 축소되지만 설명의 각 단어가 새 열로 표시됨) 해당 FS="\t";문을 삭제하세요.

"후손을 위해 s 또는 s 또는 포함된 공백을 원하지 않으면 =한 줄로 만들 수 있습니다.

awk -v OFS=, '{$1=$1;print}'

답변2

이것은 Perl 솔루션입니다. 이는 sed/awk로 가능할 수도 있지만 숫자 부분을 테스트하면 매우 보기 흉해질 수 있습니다.

ec2-describe-snapshots -H --hide-tags | \
perl -e 'use Scalar::Util qw(looks_like_number);
         while (chomp($line = <STDIN>)) {
             print(join(",", map { "\"" . (looks_like_number($_) ? "=$_" :
                                           do {s/"/""/g; $_}) . "\"" }
             split(/\t/, $line)) . "\n");
         }' \
> snapshots.csv

답변3

나처럼 게으른 사람이고 스크립트를 작성하지 않고 하나의 명령줄에서 모든 작업을 수행하고 싶다면 이 방법을 사용하면 됩니다.

ec2-describe-snapshots -H --hide-tags | sed -e 's/^I/","/g' | sed -e 's/^/"/' | sed -e 's/$/"/'> snapshots.csv

^I+ 를 ctrl누르면 됩니다 v i.

첫 번째 sed는 모두 tabs",". 두 번째는 sed각 줄의 시작 부분에 a를 삽입하고 마지막 sed는 각 줄의 끝에 종결자를 삽입합니다.""

답변4

sed는 제가 본 것 중 가장 유용한 Linux 유틸리티입니다.

sed 's/\t/","/g' TabSeparatedValues.txt > CommaSeparatedValues.csv
sed -i 's/.*/"&"/' CommaSeparatedValues.csv

첫 번째 명령은 각 줄의 모든 탭 문자를 쉼표와 따옴표로 바꿉니다. 두 번째 명령은 각 줄의 시작과 끝 부분에 따옴표를 삽입하여 각 값이 인용되도록 하여 쉼표를 값의 일부로 사용할 수 있도록 합니다.

관련 정보