내 파일에는 약 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
새 레코드를 읽기 전에 현재 레코드를 가져옵니다.perl
stdout
결과:
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