線を繰り返してユニークにしますか?

線を繰り返してユニークにしますか?

次のテキスト行構造があります。

3923 001    L05 LV,L05 RM
3923 002    L12 RA,L12 LA
3923 003    I06 ALL
3923 004    G04 RV,Z09 ALL

しかし、私にはこれが必要です:

3923 001    L05 LV
3923 001    L05 RM
3923 002    L12 RA
3923 002    L12 LA
3923 003    I06 ALL
3923 004    G04 RV
3923 004    Z09 ALL

正規表現を使用してこれを達成できますか?

デフォルトでは、各行に「、」を含む回数だけコピーしてから、10文字目から始めて一意にする必要があります。最初の部分を実行できる場合は、各行のコピー数×数字のみを使用してください。残りは手動でクリーンアップできます。

答え1

例の形式を考慮すると、最初の大きなスペースの後にあるカンマ区切り文字列の数に関係なく機能します(タブの場合は、2番目のスペースを次のようs///に変更します)。\t

sed ':;h;s/,.*//;p;x;s/    [^,]*,/    /;t;d' file

3923 001    L05 LV
3923 001    L05 RM
3923 002    L12 RA
3923 002    L12 LA
3923 003    I06 ALL
3923 004    G04 RV
3923 004    Z09 ALL

ラベルが必要な場合

タブ文字を \t で書きたい場合は、引用符 $'' を使用して Bash に指定できます: sed $':;h;s/,.*//;p;x;s/\t[^ , ] *, / /; t; d '。または、単にリテラルタブを挿入します(Bashの場合は、文字通り入力するにはcontrol-vと入力する必要があります)。 。

トビースペート

答え2

sedを使用することが可能です。以下の入力をパイプします。

| sed 's/\(^.\{12\}\)\([^,]\+\),\([^,]\+\)/\1\2\n\1\3/'

出力

3923 001    L05 LV
3923 001    L05 RM
3923 002    L12 RA
3923 002    L12 LA
3923 003    I06 ALL
3923 004    G04 RV
3923 004    Z09 ALL

以下は、複数の「,」を使用して入力を処理するソースです。

タブのない生の入力の場合は、次を使用してください。

| perl -ne '/,/ && do {chomp;s/^(.{12})(.+)/$1,$2/; @l = split(","); foreach $a (@l[1 .. $#l]) {print "$l[0]$a\n";};1;} || do {print;}'

入力にタブ文字がある場合は、次を使用します。

| perl -ne '/,/ && do{chomp; s/^([^\t]+\t)(.+)/$1,$2/; @l = split(","); foreach $a (@l[1 .. $#l]) {print "$l[0]$a\n";};1;} || do {print;}'

答え3

考えられる解決策awk

awk -F" " '{ x = $3 " " $4 " " $5; split(x, a, ","); for (i in a) { print $1, $2 "\t" a[i]; } }' file

出力は次のようになります。

3923 001    L05 LV
3923 001    L05 RM
3923 002    L12 RA
3923 002    L12 LA
3923 003    I06 ALL 
3923 004    G04 RV
3923 004    Z09 ALL

入力に複数の,コメントが含まれている場合は、次のことを試すことができます3923 001 L05 LV,L05 RM,L09 AB

awk -F" " '{ x = $3; for (i = 4; i <= NF; i++) { x = x " " $i; } split(x, a, ","); for (i in a) { print $1, $2 "\t" a[i]; } }' file

答え4

awkフィールド区切り文字を使用し、スペースまたはカンマで設定できます。次に、2つのチャンクで繰り返し、2つのチャンクで最初と2番目のフィールドを印刷します。

$ awk -v FS='(\\s+|,)' '{for (i=3; i<=NF; i+=2) print $1, $2, $i, $(i+1)}' file
3923 001 L05 LV
3923 001 L05 RM
3923 002 L12 RA
3923 002 L12 LA
3923 003 I06 ALL
3923 004 G04 RV
3923 004 Z09 ALL

関連情報