![별도의 줄에서 첫 번째 숫자 뒤에 모든 숫자의 조합을 만드는 방법](https://linux55.com/image/207571/%EB%B3%84%EB%8F%84%EC%9D%98%20%EC%A4%84%EC%97%90%EC%84%9C%20%EC%B2%AB%20%EB%B2%88%EC%A7%B8%20%EC%88%AB%EC%9E%90%20%EB%92%A4%EC%97%90%20%EB%AA%A8%EB%93%A0%20%EC%88%AB%EC%9E%90%EC%9D%98%20%EC%A1%B0%ED%95%A9%EC%9D%84%20%EB%A7%8C%EB%93%9C%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
다음 행이 포함된 빅 데이터가 있습니다.
데이터는 txt 형식입니다.
0 1,5,6,4
2,23,43,5,6
1 4 5 2 3
5 4 5 6 7
56,65
각 행은 첫 번째 숫자부터 시작하여 공백 뒤의 다른 숫자 시리즈로 간주됩니다. 공백 앞에 숫자를 가져와 같은 줄에서 쉼표로 구분된 공백 뒤에 이 숫자와 다른 모든 숫자를 사용하여 줄 조합을 수행해야 합니다.
예: 새 파일을 만들고 이 데이터를 다음과 같은 두 개의 열로 변환하고 싶습니다.
0 1
0 5
0 6
0 4
0 2
0 23
0 43
0 5
0 6
1 4
1 5
1 2
1 3
5 4
5 5
and so on...
도움을 주시면 감사하겠습니다! 다음은 이 변경을 수행하는 데 필요한 파일의 5줄 예입니다.
답변1
awk
너와 함께 있고 싶어
function splitAndPrint(lineId, line, separator) {
split(line, arr, separator)
for (v in arr){
print lineId" "arr[v]
}
}
{
if ($0 ~ /^[0-9] /) { # matches the digit before space
digitBeforeSpace = $1
sub(/^[0-9] +/, "") # removes that digit
}
if($0 ~ /,/){
# separator is ,
splitAndPrint(digitBeforeSpace, $0, ",")
}
else {
# separator is space
splitAndPrint(digitBeforeSpace, $0, " ")
}
}
답변2
사용sed
$ cat input_file
0 1,5,6,4,2,23,43,5,6
1 4,5,2,3
5 4,5,6,7,56,65
$ sed ':a;s/\([^ ]*\) \+\([^,]*\),/\1 \2\n\1 /;ta' input_file
0 1
0 5
0 6
0 4
0 2
0 23
0 43
0 5
0 6
1 4
1 5
1 2
1 3
5 4
5 5
5 6
5 7
5 56
5 65