次の入力テキストファイルがあります。
table columns are:
number of vertices
total surface area (mm^2)
total gray matter volume (mm^3)
average cortical thickness +- standard deviation (mm)
integrated rectified mean curvature
integrated rectified gaussian curvature
folding index
intrinsic curvature index
structure name
72 6.18 1307 87.23 987 0.566 2 3 1.8 SUBJECT_89765432/label/lh.APD57_20d.label
table columns are:
....(repeat)
次のようにコンマ区切りの変数を出力するファイルを作成したいと思います。
Id,surface area (mm^2),gray matter volume (mm^3),avg cortical thickness +- sd (mm),mean curvature,gaussian curvature,folding index,curvature index,hemi,ROI
SUBJECT_89765432,72,6.18,1307,87.23,987,2,3,1.18, lh, 20d
SUBJECT_...(repeat)
どうすればいいですか?とても感謝しています!
答え1
sed '/SUBJECT_/!d;s/ /,/g;s/\(.*\),\(SUBJECT_[0-9]*\).*/\2,\1/'
/SUBJECT_/!d
キーワードのない行をすべて削除します。 (スクリプトを介してヘッダを作成する必要はありません。)s/ /,/g
スペースの代わりにカンマを使用してくださいs/\(.*\),\(SUBJECT_[0-9]*\).*/\2,\1/
並べ替える
答え2
次のスクリプトは、Text::CSV
Perlモジュールを非常にハッキング的に使用することです。通常、これは正しい形式のCSVファイルを解析して出力するために使用されますが、ここでは必要なsay()
場合(たとえば、スペース、行が含まれている場合)、フィールドを正しく参照するために独自のコードを記述したくないので、その方法で使用します。あります。 -フィード、二重引用符、またはコンマ)。
#!/usr/bin/perl -an
use Text::CSV qw(csv);
BEGIN {
$csv=Text::CSV->new();
# define our column headers in the right order.
@columns = ("Id", "surface area (mm^2)", "gray matter volume (mm^3)",
"avg cortical thickness +- sd (mm)", "mean curvature",
"gaussian curvature", "folding index", "curvature index", "hemi", "ROI");
# output them as a CSV field header.
$csv->say(*STDOUT, \@columns );
};
# skip lines that don't begin with a digit
next unless /^\d/;
# Split the subject (field 10) into multiple sub-fields
# perl arrays start from 0, so the 10th field is $F[9].
# This will split it into an array like:
# SUBJECT 89765432 label lh APD57 20d label
# 0 1 2 3 4 5 6
my @subject=split(/[\/_.]/,$F[9]);
# Insert the first two of those sub-fields at the beginning of the input array
# as one new field joined by an underscore.
unshift @F, $subject[0] . "_" . $subject[1];
# Inserting that field means that field 10 is now field 11 - i.e. $F[9] is now $F[10].
# Replace it with the hemi value, and add a new ROI field at the end.
$F[10]=$subject[3];
push @F, $subject[5];
# print it as properly-formatted CSV.
$csv->say(*STDOUT, \@F);
出力:
Id,"surface area (mm^2)","gray matter volume (mm^3)","avg cortical thickness +- sd (mm)","mean curvature","gaussian curvature","folding index","curvature index",hemi,ROI
SUBJECT_89765432,72,6.18,1307,87.23,987,0.566,2,3,1.8,lh,20d