SED 또는 AWK를 사용하여 문자열을 새 열과 행으로 이동

SED 또는 AWK를 사용하여 문자열을 새 열과 행으로 이동

탭으로 구분된 .csv 파일이 있는데 머리글 행 정보를 처음에 있는 "새" 열로 이동한 다음 지정된 행 수만큼 아래로 이동해야 합니다. sed또는 등 현재 사용하고 있는 표준 도구를 사용하고 싶지만 awk다른 도구/접근 방식이 더 적합하다면 제안을 환영합니다. 각 파일의 제목이 변경되므로 적절한 행과 열에 "CAT" 문자열을 배치하는 대신 파일을 복사해야 합니다.

                            CAT
    DOG     DOG     DOG     DOG     DOG     DOG     DOG
    DOG     DOG     DOG     DOG     DOG     DOG     DOG
    DOG     DOG     DOG     DOG     DOG     DOG     DOG
    DOG     DOG     DOG     DOG     DOG     DOG     DOG

될 것입니다:

                            CAT
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
    CAT     DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG

답변1

paste다음과 같이 할 수도 있습니다.

편집됨

그러면 첫 번째 줄이 다시 인쇄됩니다. 따옴표가 없다는 점을 이용하여 후행 공백이 표시되지 않습니다.

$ paste -d"\t" <(printf "\n\n\n%s" $(head -1 file)) file
                                    CAT
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
CAT         DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG

원래

$ -d"\t" <(printf "\n\n\nCAT") file
                                    CAT
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG
CAT         DOG     DOG     DOG     DOG     DOG     DOG     DOG
            DOG     DOG     DOG     DOG     DOG     DOG     DOG

답변2

다음 sed 명령이 저에게 효과적이었습니다.

sed '1!s/^/\t/;4s/^/CAT/' 

설명하다:

1번 이외의 줄에서는 줄의 시작 부분을 탭 문자로 바꿉니다. 네 번째 줄에서 줄의 시작 부분을 CAT 문자열로 바꿉니다.

답변3

sed다음과 같이 사용할 수 있다고 생각합니다 .

  1. hold첫 번째 줄을 공간에 저장
  2. 라인 2에서 시작하는 추가 탭(열)을 추가합니다(이렇게 하면 헤더의 원래 열 정렬이 유지됩니다).
  3. 지정된 다음 줄(아래 예에서는 4번 줄을 사용했습니다)에서 hold뒤에 오는 내용을 공백으로 바꾸고 pattern공백을 제거한 후 줄 앞에 추가합니다.

$ sed -e '1h' -e '2,$s/^/\t/' -e '4{x;s/[[:space:]]//g;G;s/\n//}' file
                                CAT
                DOG     DOG     DOG     DOG     DOG     DOG     DOG
                DOG     DOG     DOG     DOG     DOG     DOG     DOG
    CAT         DOG     DOG     DOG     DOG     DOG     DOG     DOG
                DOG     DOG     DOG     DOG     DOG     DOG     DOG

답변4

사용 awk:

awk -v line=4 -F '^\t*|\t+' '
  NR==1 { OFS="\t"; ins=$2 }
  NR!=line { print "","",$0 }
  NR==line { print "",ins,$0 }' file

삽입할 텍스트로 헤더 행의 비어 있지 않은 첫 번째 필드를 사용하므로 탭이나 줄 바꿈을 제외한 모든 텍스트를 포함할 수 있습니다. 에서 항상 두 번째 필드로 읽혀지도록 필드 구분 기호를 설정합니다 awk.

관련 정보