2行目から始めて3行ごとにグループ化し、結合された2行目と3行目から最初の列を削除します。

2行目から始めて3行ごとにグループ化し、結合された2行目と3行目から最初の列を削除します。

私は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,$)の場合は、Next行とNext行をパターンスペースにインポートし、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..*]0key1..*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

https://docs.raku.org/言語/hashmap
https://raku.org

関連情報