行反復、フィールド分割

行反復、フィールド分割

各行には、次のタブで区切られたファイルがあります。

K00001;K00004;K00008    0   0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0

次のように、一意のコードと同じ一連の数字を持つ行が必要です。

K00001 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0    
K00004 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0    
K00008 0    0   34  0   0   0   0   0   0   0   0   0   0   0   0   0   36  0   0   52  0   0   0   6   0

ベストアンサー1

awkを使用して最初の列を分割できます。

~$ awk '{split($1,a,";"); $1="";for (i in a){print a[i],$0}}' myfile
K00001  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0
K00004  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0
K00008  0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 0 36 0 0 52 0 0 0 6 0

;()で最初の列を分割し、split($1,a,";")それを削除して$0配列内の各項目の完全な(新しい)行を印刷します()。


コメントで提案したように、編集後にタブ文字が区切り文字として使用されることがわかります。タブを出力フィールド区切り文字として使用するには、OFS="\t"たとえばBEGINawkセクションを使用できます。また、空のフィールドが挿入されます$1=""。したがって、printの代わりにa[i]then printに$0設定してください。$1a[i]$0

~$ awk 'BEGIN{OFS="\t"}{split($1,a,";"); for (i in a){$1=a[i];print}}' myfile
K00001  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0
K00004  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0
K00008  0       0       34      0       0       0       0       0       0       0       0       0       0       0       0       0       36      0       0       52      0       0       0       6       0

おすすめ記事