SED는 CSV 열을 삭제합니다(존재하는 경우).

SED는 CSV 열을 삭제합니다(존재하는 경우).

테이블 CSV 파일이 있는 경우 이 열을 제거해야 합니다.

내 CSV 파일:

GENE REF ALT
AKT  A   G
AKT  G   G

원하는 출력: REF 열이 있는 경우 제거합니다.

GENE  ALT
AKT    G
AKT    G

나는 이것을 시도한다:

sed 's/\tREF.[^\t]*//' filename.csv

하지만 작동하지 않습니다.

답변1

안녕하세요 밀러(http://johnkerl.org/miller/doc) 그리고 이 input.csv

GENE,REF,ALT
AKT,A,G
AKT,G,G

아주 쉽게

mlr --csv cut -x -f REF input.csv

출력은 다음과 같습니다

GENE,ALT
AKT,G
AKT,G

답변2

그리고perl

$ perl -F'\t' -lane '@non_ref_cols = grep { $F[$_] ne "REF" } 0..$#F if $. == 1;
                     print join "\t", @F[@non_ref_cols]' ip.txt
GENE    ALT
AKT     G
AKT     G
  • -F'\t'탭을 필드 구분자로 사용
  • @non_ref_cols = grep { $F[$_] ne "REF" } 0..$#F if $. == 1헤더 행의 경우 필드가 아닌 모든 항목의 색인을 가져옵니다.REF
  • print join "\t", @F[@non_ref_cols]헤더 행에 대해 얻은 인덱스 배열을 사용하고 탭을 필드 구분 기호로 사용하여 모든 필드를 인쇄합니다.

답변3

awk를 사용하세요:

awk -F'\t' -v OFS='\t' '
  NR == 1 {for (i=1; i<=NF; i++) if ($i == "REF") refCol = i}
  refCol {for (i = refCol + 1; i <=NF; i++) $(i-1) = $i; NF--}
  1
' file.csv

첫 번째 줄은 어떤 열이 REF ​​열인지 찾습니다. 해당 열이 없으면 refCol 변수가 초기화되지 않습니다.
열이 발견되면 두 번째 행에서 해당 열을 삭제합니다.
세 번째 줄은 레코드를 인쇄합니다.

답변4

어떤 열이 REF있는지 확인한 grep다음 제거하기로 결정할 수 있습니다. 예를 들어 GNU cut을 사용하고 제목이 단일 단어이고 구분 기호가 탭이라고 가정합니다.

colnumber=$(head -n1 file.tsv | grep -o '[^\t]\+' | grep -nx 'REF' | cut -d: -f1)
[[ -n $colnumber ]] && cut --complement -f$colnumber file.tsv > file.tsv.new

산출:

GENE    ALT
AKT     G
AKT     G

관련 정보