各行には、次のタブで区切られたファイルがあります。
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"
たとえばBEGIN
awkセクションを使用できます。また、空のフィールドが挿入されます$1=""
。したがって、printの代わりにa[i]
then printに$0
設定してください。$1
a[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
答え2
必要に応じて動作する必要があります。デフォルトでは、最初のフィールド(キー)を分割し、分割を最初のフィールドに制限して残りのフィールド$k
を配置します。次に、キーを分離し、残りのフィールドとともに各キーを1行に印刷します。$f
\t
2
;
perl -nle '($k, $f) = split "\t", $_, 2; print "$_\t$f" for split ";", $k'
-n
ループ入力。ファイルをPerlにパイプするか、コマンドラインの最後に入力ファイル名を渡すことができます。-l
自動行末管理を有効にします。
答え3
そしてsed
:
sed 's/^\([^[:blank:];]*\);\([^[:blank:]]*\)\(.*\)/\1\3\
\2\3/;P;D'
答え4
もう一つのPerlの説明です。
$ perl -pe 's/^([^;]+);([^;]+);(\S+)\s+(.*)/$1 $4\n$2 $4\n$3 $4/' file
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
別のsedシングルライナー。
$ sed 's/^\([^;]\+\);\([^;]\+\);\([^ ]\+\) \+\(.*\)/\1 \4\n\2 \4\n\3 \4/' file
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