열을 하나로 결합(스택)

열을 하나로 결합(스택)

각 열이 열 내에서 서로 "겹치도록" 형식을 다시 지정하려는 데이터 열이 여러 개 있습니다.

입력 예:

1  2  3  4
1  2  3  4

원하는 출력: ("1"과 "3"이 누락된 오래된 철자 오류를 수정했습니다.)

1
1
2
2
3
3
4
4

(가끔 열 사이에 공백을 추가하고 싶을 때도 있습니다)

편집하다: "사이의 공간"에 대한 설명은 불분명합니다. 때로는 쌓인 열 사이에 빈 행을 갖고 싶을 때가 있습니다. 아래 Ed Morton의 답변을 적용하면 다음과 같이 달성할 수 있습니다.

awk '
{for (i=1; i<=NF; i++) a[i]=a[i] $i ORS}
END {for (i=1; i<=NF; i++) printf "%s", a[i](i==NF?"":"\n")}
' file

답변1

datamash데이터를 바꾼 다음 공백을 개행 문자로 변환하는 데 사용됩니다 tr( -s여러 공백을 하나로 압축하는 동안).

datamash -t' ' transpose <infile | tr -s ' ' '\n'

답변2

이것은 아마도 모든 Unix 시스템의 모든 쉘에서 awk를 사용하여 원하는 것일 것입니다.

$ awk '
    { for (i=1; i<=NF; i++) a[i] = a[i] $i ORS }
    END { for (i=1; i<=NF; i++) printf "%s", a[i] }
' file
1
1
2
2
3
3
4
4

답변3

GNU grep은 어떻습니까?

grep -o '\S*' infile

또는 확장하여 다음과 동일합니다 \S.

grep -o '[^ \t\r\n\v\f]*' infile

열의 순서를 유지해야 하는 경우 시도해 보십시오(GNU 정렬 사용).

$ awk '{for (i=1;i<=NF;i++){ print i,$i }}' infile | 
      sort -snbk 1,1 | 
      awk '{$1=""}1'

1
1
2
2
3
3
4
4

또는 , awk및 열 전치와 유사한 절차를 사용하세요.

awk '{ for(i=1;i<=NF;i++) { f[i]=(f[i]==""?"":f[i] ORS) $i; if(NF>n) n=NF}}
       END { for(i=1; i<=n; i++) { print f[i] }  }
    '  infile

답변4

이 답변은 열과 행이 인쇄되는 순서를 전환하여 본질적으로 원본 데이터를 전치하는 데 의존합니다.

OP의 질문에서 동일한 출력이 업데이트되었는데, 이는 원래 예상대로 올바르지 않았습니다.

for i in `seq 4`; do 
    awk -v field=$i '{ print $field }' infile; 
done

1
1
2
2
3
3
4
4

관련 정보