
私はUNIXとコーディング全体に初めて触れ、長い間この問題を解決しようとしましたが、成功しませんでした。私はこれが非常に簡単な解決策であると確信していますが、誰かが私を正しい方向に導くことができれば役に立ちます。
次の形式のデータを含むSummary.txtファイルがあります。
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z
Sample12345.avg l m n
Sample12345.stdn o p q
Sample98765 w2 x2 y2 z2
Sample98765.avg l2 m2 n2
Sample98765.stdn o2 p2 q2
その他など
同じサンプル番号を持つ3行を組み合わせて名前だけを保持したいと思います。
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
その他など
たとえば、sedを使用してみました(最初にSample12345.avg Sample12345.stdnなどを含むSummary_temp.txtを作成した後)。
for i in `cat Summary_temp.txt`; do sed 's/\n$i//g' Summary.txt; done
"-bash:予期しないトークン 'sed'の近くに構文エラーが発生しました。"
私もこの道に行こうとしました。
paste -sd ' ' Summary.txt | sed 's/\t/\n/g10; s/\t/@/g; s/\n/\t/g' | sed 's/.\nSample.*.avg//g' | head
私が得た最も近いものは次のとおりです。
cat Summary.txt | sed 's/ *| */,/g;/^$/d' | paste -d, - - - | head
しかし、これは最初の行から始まるので、すべてがマイナス1です。
Name criteria1 2 3 4 5 6 7 8 9 10 Sample12345 w x y z Sample12345.avg l m n
Sample12345.stdn o p q Sample98765 w2 x2 y2 z2 Sample98765.avg l2 m2 n2
Sample98765.stdn o2 p2 q2 ETC ETC
head -1 Summary.txt > Summary_temp_3.txt
後でもう一度追加できるようにしてみました。
sed '1d' Summary.txt > Summary_temp_4.txt
cat Summary_temp_4.txt | sed 's/ *| */,/g;/^$/d' |
paste -d, - - - | sed 's/,.*_by_name//g | head
これはまったく何も表示しません。最終的にctrl-Cを押す必要があるので、それは時間がかからないので、それが間違っていると仮定します。助けてください。私は初心者であり、これはおそらく簡単に解決できる愚かな問題であることを知っていますが、さらに何を試すべきかわかりません。
答え1
特にエレガントではありませんが、2番目の最後の行(2,$
)の場合は、N
ext行とN
ext行をパターンスペースにインポートし、g
改行文字の後の空白ではないシーケンスをグローバルに置き換えます。
sed '
2,${
N
N
s/\n[^[:blank:]]*//g
}
' Summary.txt
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
答え2
+paste
メソッドsed
は次のとおりです(ファイルに,
文字がないと仮定)。
$ paste -sd '\n,,' your-file | sed 's/,[^[:blank:]]*//g'
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
答え3
入力データが一貫している場合(たとえば、3行ごとにグループの最初の行の最初のフィールドを共有する場合)、次のように1つのawk
コマンドのみが必要です。
awk '
NR==1{print;next}
NR%3==0{$1="";printf $0}
NR%3==1{$1="";printf $0;print ""}
NR%3==2{printf $0}
' infile
結果:
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
答え4
使用幸せ(以前のPerl_6)
あなたが説明するものは、次のように最もよく表現されます。ハッシュ、keys
固有の状態に保たれるからです。対応するキーと値のペアがない場合は、追加のキーと値のペアがハッシュに新しいペアとして追加され、key
それ以外の場合は、同じ名前の既存のvalues
キーと値のペアに追加されます。key
簡単な例を見てください:
~$ raku -ne 'BEGIN my %h; %h.append: .split(" ", 2); END .put for %h.sort;' file
上記のコードは単純な最初の列「キー」を処理し、行の残りの部分は「値」になります。 OPが提供するより複雑なデータセットの場合は、以下を削除して拡張する必要があり.stdn
ます.avg
。
~$ raku -ne 'BEGIN my %h; \
.split(/ \. <alpha>+ | \s+ /, :skip-empty) andthen \
%h.append(.[0] => .[1..*]); \
END .put for %h.sort;' file
詳細については、Rakuコードは、-ne
自動印刷されない限り、1行ずつフラグを使用して実行されます。行を繰り返す前にBEGIN
ハッシュを宣言します。%h
その後、行はオンにsplit
なっているか\. <alpha>+
(「.avg」や「.stdn」など)、空\s+
です。分割後、キーと値のペアを使用して再ロード$_
してandthen
ハッシュします。 「太い矢印」構文は、キーと値のペアを意味/生成します。たとえば、最初の列(インデックス=)は、残り(インデックス=)要素はになります。append
%h
=>
.[0] => .[1..*]
0
key
1..*
values
入力例:
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z
Sample12345.avg l m n
Sample12345.stdn o p q
Sample98765 w2 x2 y2 z2
Sample98765.avg l2 m2 n2
Sample98765.stdn o2 p2 q2
出力例(キーと値の間にTabキーを押す):
Name criteria1 2 3 4 5 6 7 8 9 10
Sample12345 w x y z l m n o p q
Sample98765 w2 x2 y2 z2 l2 m2 n2 o2 p2 q2
最後に、CSVファイルの出力を使用するには、join
すべての要素をカンマで囲みます(単一値を含む)。完全な答えは次のとおりです。
~$ raku -ne 'BEGIN my %h; \
.split(/ \. <alpha>+ | \s+ /, :skip-empty) andthen \
%h.append(.[0] => .[1..*]); \
END put .keys ~ "," ~ .values.map: *.join(",") for %h.sort;' file
Sample98765,w2,x2,y2,z2,l2,m2,n2,o2,p2,q2
Sample12345,w,x,y,z,l,m,n,o,p,q
Name,criteria1,2,3,4,5,6,7,8,9,10
コードを再確認するには、次の変更を行います。
.values.map: *.join(",")
到着.values.map: *.elems
value
キーごとに10個の列数を返します。
Name,10
Sample12345,10
Sample98765,10