각 열이 열 내에서 서로 "겹치도록" 형식을 다시 지정하려는 데이터 열이 여러 개 있습니다.
입력 예:
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