두 쉼표 사이의 문자를 추출하시겠습니까?

두 쉼표 사이의 문자를 추출하시겠습니까?

내 파일에는 약 300만 줄이 있습니다. 다음은 파일의 처음 몇 줄입니다.

head out.txt
    NA
    NA
    NA
    NA
    NA
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753,gene85754
    gene85752,gene85753,gene85754
    gene85752,gene85753,gene85754
    gene85752,gene85753,gene85754
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752,gene85753
    gene85752
    gene85752

""로 구분된 줄의 경우 첫 번째 쉼표 뒤와 두 번째 쉼표 앞의 모든 내용을 유지하고 싶습니다. 이것이 내가 원하는 결과입니다:

outgood.txt
NA
NA
NA
NA
NA
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85752
gene85752

답변1

cut구분되지 않은 줄은 기본적으로 인쇄되므로 다음이 작동합니다 .

cut -f2 -d, file

답변2

awk -F, 'NF > 1 { $1 = $2 } { print $1 }' file

awk이는 파일을 쉼표로 구분된 필드로 구성된 줄로 구문 분석하는 데 사용됩니다 .

코드는 행에 여러 필드가 있는 경우를 감지하고, 그렇다면 첫 번째 필드를 두 번째 필드로 바꿉니다. 그런 다음 조건부 코드에 의해 수정되거나 수정되지 않은 첫 번째 필드를 인쇄합니다.

답변3

awk -F, 'NF == 1 {print $1}
         NF > 1 { print $2}' filename

쉼표가 없으면 첫 번째 문자열만 인쇄되고, 쉼표가 하나 이상 있으면 두 번째 문자열이 인쇄됩니다.

답변4

Perl다음과 같이 이 작업을 수행 할 수 있습니다 .

명령줄:

$ perl -F, -pale '$_ = $F[1] // $_' out.txt

설명하다:

  • -p레코드는 한 줄씩 읽혀지고 다음 레코드 또는 eof를 읽기 전에 자동으로 인쇄됩니다.
  • -l만들다IRS = ORS = "\n"
  • -F,FS쉼표를 만드세요 .
  • -a필드 구분 기호(여기서는 쉼표)로 각 레코드를 분할 하고 결과 필드를 0 인덱스 $_배열에 저장합니다 .@F
  • -e즉, 그 뒤에 오는 것은 Perl각 레코드에 적용될 코드입니다.
  • $_ = $F[1] // $_표현식은 다음과 같습니다. $F[1]두 번째 필드가 정의되지 않은 경우 현재 레코드가 사용됩니다 $_. 그러면 이 표현식의 결과가 현재 레코드에 할당됩니다 $_.
  • 사용 중 전환으로 인해 -p새 레코드를 읽기 전에 현재 레코드를 가져옵니다.perlstdout

결과:

NA
NA
NA
NA
NA
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85753
gene85752
gene85752

sed다음과 같이 GNU 버전의 편집기를 사용하여 이 작업을 수행 할 수도 있습니다 .

$ sed -ne '
    s/,/\n/
    s/.*\n//
    s/,/\n/
    P
' out.txt

관련 정보