n 열마다 새 행을 시작하는 방법은 무엇입니까?

n 열마다 새 행을 시작하는 방법은 무엇입니까?

그래서 길이가 20,000개의 "열"이고 길이가 2줄인 텍스트 파일이 있습니다. 데이터는 다음과 같습니다.

  FP1 amp     FP1 lat     FP2 amp       FP2 lat    FP3 amp       FP3 lat      AF1 amp         AF1 lat 
  4.1         231         2.2           232        1.3            233         4.4             234

120개 정도의 열마다 헤더 값이 두 번째 행에서 다른 값으로 반복됩니다. 120개 열마다 이러한 "열"을 분리하고 새 줄을 시작하여 파일 끝까지 계속하려면 어떻게 해야 합니까?

답변1

데이터를 전치하기 위해 BSD를 사용한다고 가정합니다 rs.

$ rs -T
a b c d e f g h
1 2 3 4 5 6 7 8
[Ctrl-D][Enter]
a  1
b  2
c  3
d  4
e  5
f  6
g  7
h  8

이제 다루기 쉬운 두 개의 긴 열로 구성되었습니다 awk. 데이터를 스캔하고 $1및 에서 문자열 쌍을 축적할 수 있습니다 $2. NR필요한 행 크기가 모듈로 0일 때마다 누적된 문자열을 출력합니다.

$ awk '{ hdrs = (hdrs ? hdrs OFS $1 : $1);
         vals = (vals ? vals OFS $2 : $2); }
       !(NR % 3) { print hdrs; print vals;
                   hdrs = vals = "" } 
       END { print hdrs; print vals; }'
a  1
b  2
c  3
d  4
e  5
f  6
g  7
h  8
[Ctrl-D][Enter]
a b c
1 2 3
d e f
4 5 6
g h
7 8

이와 같은 다른 출력 형태(일관된 패턴으로 별도로 래핑된 헤더와 값)가 필요한 경우 Awk 코드에서 이를 제거하는 것은 어렵지 않습니다.

a b c
d e f
g h
1 2 3
4 5 6
7 8

이제 실제 데이터는 필드 헤더가 여러 공백으로 구분되고 자체적으로 공백을 포함하기 때문에 엉망이 됩니다.

필드에 내부 공백이 하나만 포함되어 있고 항상 여러 공백으로 구분되어 있다고 가정하면 데이터를 전처리하여 내부 공백을 공백이 아닌 문자(아직 데이터에 존재하지 않음)로 바꾸는 것입니다(예: 물결표). ( ~). 예를 들어 Sed를 사용하는 경우:

$ sed -e 's/\([^ ]\) \([^ ]\)/\1~\2/g'
foo bar      xyzzy quux      alpha beta     gamma     delta
[Ctrl-D][Enter]
foo~bar      xyzzy~quux      alpha~beta     gamma     delta

다시 필터링하는 것은 쉽습니다.

tr '~' ' '

관련 정보