Frequencies -- 1403.6738 1403.6738 1403.6738
IR Inten -- 25.0809 25.0809 25.0809
나는 두 개의 열을 원한다
Frequencies IR Inten
1403.6738 25.0809
등.
답변1
Raku(이전에는 Perl6으로 알려진 프로그래밍 언어) 사용
Z
Raku는 이러한 종류의 문제를 해결하기 위해 각 목록의 항목을 하나씩 "압축"하는 영리한 연산자를 가지고 있습니다 .
~$ raku -e 'my @array1 = lines(); put ( [Z] @array1[0].words, @array1[1].words).join("\n");' Freq_IR.txt
Frequencies IR_Inten
-- --
1403.6738 25.0809
1403.6738 25.0809
1403.6738 25.0809
참고: 두 번째 열의 제목이 " "가 되도록 위의 헤더 행을 수정해야 했습니다 IR_Inten
. 위의 코드를 사용하여 데이터를 재정렬하기 전에 아래 코드를 수동으로 편집하거나 실행할 수 있습니다.
~$ raku -pe 's/IR \s Inten/IR_Inten/;' Freq_IR.txt > Freq_IR2.txt
HTH.
https://raku.org
https://docs.raku.org/언어/operators#Zip_metaoperator
https://docs.raku.org/언어/operators#index-entry-[+]_(reduction_metaoperators)
답변2
모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.
$ awk -F' -- ' -v OFS='\t' '
{ hdr[NR]=$1; n=split($2,v," "); for (i in v) vals[NR,i]=v[i] }
END { print hdr[1], hdr[2]; for (i=1; i<=n; i++) print vals[1,i], vals[2,i] }
' file
Frequencies IR Inten
1403.6738 25.0809
1403.6738 25.0809
1403.6738 25.0809
그리고 원하는 수의 출력 행과 열에 대해 작동합니다.
awk -F' -- ' -v OFS='\t' '
{ hdr[NR]=$1; n=split($2,v," "); for (i in v) vals[NR,i]=v[i] }
END {
for (c=1; c<=NR; c++) {
printf "%s%s", hdr[c], (c<NR ? OFS : ORS)
}
for (r=1; r<=n; r++) {
for (c=1; c<=NR; c++) {
printf "%s%s", vals[c,r], (c<NR ? OFS : ORS)
}
}
}
' file
답변3
awk를 사용하면 데이터 변환을 수행할 수 있습니다.
awk -F ' -- ' '
{
# populate the array
a[++N] = $1; split($2, t, " ")
for (k in t) { a[++N] = t[k] }
}
END {ORS = ""
for (c=i=1; i<=N/NR; i++) {
for (j=i; j<=N; j+=N/NR) {
print a[j] (c++%NR ? "\t" : "\n")
}
}
}
' file
Frequencies IR Inten
1403.6738 25.0809
1403.6738 25.0809
1403.6738 25.0809
기본 아이디어는 배열을 먼저 채우고 끝에 배열의 길이를 기록하는 것입니다. 그런 다음 배열을 N/NR 부분으로 나누고 각 부분에서 해당 요소를 선택합니다. Python과 같은 다른 언어에서는 이 작업을 이라고 합니다 zip
.