다음 행이 포함된 빅 데이터가 있습니다.
0 1 5 6 4
1 4 5 2 3
5 4 5 6 7
데이터는 txt 형식이며 새 파일을 만들고 이 데이터를 다음과 같은 두 개의 열로 변환하고 싶습니다.
0 1
0 5
0 6
0 4
1 4
1 5
1 2
1 3
5 4
5 5
5 6
5 7
도움을 주시면 감사하겠습니다!
답변1
이상한 솔루션
awk 실행 파일 conv_table.awk
:
#! /usr/bin/awk -f
{
# for all fields after the first column
for (idx = 2; idx <= NF; idx++) {
# print first column followed by another valued column
print $1, $idx
}
}
이는 다음과 같은 명령으로 실행될 수 있습니다.
chmod 755 conv_table.awk
다음과 같이 실행하세요:
./conv_table.awk table.txt > output.txt
한 줄 버전:
awk '{for(idx=2;idx<=NF;idx++){print $1,$idx}}' table.txt > output.txt
답변2
사용행복하다(이전 Perl_6)
raku -e 'for lines.map(*.words) {Map.new(.[0] => .[1..*-1]).invert.map(*.antipairs.put)};'
또는
raku -ne 'Map.new(.[0] => .[1..*-1]).invert.map(*.antipairs.put) given .words;'
입력 예:
0 1 5 6 4
1 4 5 2 3
5 4 5 6 7
예제 출력:
0 1
0 5
0 6
0 4
1 4
1 5
1 2
1 3
5 4
5 5
5 6
5 7
Raku 사용의 장점은 내장된 Hash
(변경 가능) 및 Map
(불변 해싱) 기능입니다. 위에서 한 줄씩 입력하면 공백으로 구분됩니다 words
. 첫 번째 요소 .[0]
는 키로 사용되고 나머지 요소는 .[1..*-1]
값으로 사용됩니다. (참고로 =>
"굵은 화살표"는 키/값 쌍을 구성합니다).
Map
객체 내부에 들어가면 각 입력 줄은 기본적으로 다음과 같습니다.
key => [val1 val2 val3 val4]
개체를 원하는 출력으로 재배열할 수 있습니다. 먼저 개체를 invert
편집하여 각 구조를 다음과 같이 확장합니다.
(val1 => key) (val2 => key) (val3 => key) (val4 => key)
둘째, antipairs
키/값 교환의 경우:
(key => val1) (key => val2) (key => val3) (key => val4)
마지막으로 데이터 구조가 반복되어 한 put
줄(탭으로 구분)당 하나의 키/값 쌍을 출력합니다.
https://docs.raku.org/type/Hash#Routines_supplied_by_class_Map
https://raku.org
답변3
mawk 'sub("^\n*",substr(_,OFS="\n"$!_" ",$!_=_),$!(NF=NF))'
0 1
0 5
0 6
0 4
1 4
1 5
1 2
1 3
5 4
5 5
5 6
5 7