複数列形式が2列形式に変更されました。

複数列形式が2列形式に変更されました。

次のファイルがあります。

1 a,b,c
2 z
3 d,f

次の形式が必要です。

1 a
1 b
1 c
2 z
3 d
3 f

答え1

奇妙な解決策:

$ cat file
1 a,b,c
2 z
3 d,f

$ awk '{ gsub(",", "\n"$1" "); print; }' file
1 a
1 b
1 c
2 z
3 d
3 f

答え2

入力が見えるように単純な場合は、bashシェルスクリプトがうまくできない操作を実行するシェルスクリプトは次のとおりです。

#!/usr/bin/env bash
declare -a col2
while read col1 rest
do
  IFS=, read -a col2 <<< "$rest"
  for value in ${col2[*]}
  do
    printf "%s %s\n" "$col1" "$value"
  done
done < input

これを行うより良い方法があります(read -aPOSIXではなくbashのみ)。これを行う他の方法(awk、perl)があります。データがより複雑な場合は、(1 a,"b,c",d)この(1 a,b\,c,d)スクリプトが必要に応じて機能しない可能性があります。

答え3

これを試してみてください:

sild@:/tmp $ cat test
1 a,b,c
2 z
3 d,f
sild@:/tmp $ cat test.sh 
#!/bin/bash
separator=","
cat test | while read line; do
 head="`echo $line | cut -d" " -f1`"
 IFS="$separator" read -ra nodes <<< "`echo $line | cut -d" " -f2-`"
 for i in "${nodes[@]}"; do
         echo $head $i
     done
 done
sild@:/tmp $ ./test.sh 
1 a
1 b
1 c
2 z
3 d
3 f
sild@:/tmp $ 

答え4

Perlソリューション:

perl -ane 'print map "$F[0] $_\n" ,split(",",$F[1])' file
1 a
1 b
1 c
2 z
3 d
3 f

関連情報