텍스트 파일의 내용을 새 출력 파일로 조작하는 방법

텍스트 파일의 내용을 새 출력 파일로 조작하는 방법

다음과 같은 입력 텍스트 파일이 있습니다.

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::CSVPerl 모듈을 매우 해킹적으로 사용하는 것입니다. 일반적으로 이는 올바른 형식의 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

관련 정보