awk는 탭 구분 파일에 열을 추가하지 않습니다.

awk는 탭 구분 파일에 열을 추가하지 않습니다.

다음 코드를 사용하여 다른 기존 열의 계산을 기반으로 탭 구분 txt 파일에 두 개의 새 열(15 및 16)을 추가하고 있습니다.

문제: 새 열 데이터가 터미널에 표시되지만 파일이 열로 업데이트되지 않습니다. 다른 파일( )로 보내면 code ... > Sample.....2.txt열은 존재하지만 구분 기호는 탭에서 공백으로 변경됩니다.

필수: 탭으로 구분된 파일의 기존 열 계산을 기반으로 코드 한 줄에 열 15와 16을 추가합니다.

파일: Sample1_RVDB_sort_unique.txt

암호:

awk '{$15 = ($4/$13)*100; $16 = ($4/$14)*100; print}' Sample1_RVDB_sort_unique.txt

데이터

utg000001l  acc|GENBANK|MH883318.1|White    80.263  608 99  16  282 877 184245  184843  4.44e-120   438 2022    270609

답변1

입력 파일이 탭으로 구분된 경우 입력 필드 구분 기호( FS또는 awk -F옵션 사용)를 탭( \t)으로 설정해야 합니다. 그렇지 않으면 awk는 기본 FS(하나 이상의 공백 - 참조)를 사용합니다.기본 필드 분할GNU awk 문서에서 - 그러나 이것은 awk뿐만 아니라 모든 awk의 동작입니다 gawk.

출력을 탭으로 구분하려면 OFS출력 필드 구분 기호( )도 탭으로 설정해야 합니다. 그렇지 않으면 awk는 기본 OFS(공백)를 사용합니다.

예를 들어

awk -F'\t' -v OFS='\t' '{ $15 = ($4/$13)*100;
                          $16 = ($4/$14)*100;
                          print
                        }' Sample1_RVDB_sort_unique.txt

답변2

필드 구분 기호가 무엇인지 awk에 알려주어야 합니다. 예를 들면 다음과 같습니다.

BEGIN { FS=OFS="\t" }

그렇지 않으면 입력이 공백 체인이고 출력이 단일 공백 ​​문자라고 가정합니다.

입력에 14개의 필드만 있는 경우 추가 출력 필드를 인쇄하는 것이 레코드에 새 $15 및 $16 필드를 만드는 것보다 더 효율적입니다(이렇게 하면 레코드가 다시 컴파일됩니다).

awk '
    BEGIN { FS=OFS="\t" }
    { print $0, ($4/$13)*100, ($4/$14)*100 }
' Sample1_RVDB_sort_unique.txt

또한 $13 및/또는 $14가 0이 아닌지 확인해야 합니다. 예를 들면 다음과 같습니다.

awk '
    BEGIN { FS=OFS="\t" }
    { print $0, ($13 ? ($4/$13)*100 : "Inf"), ($14 ? ($4/$14)*100 : "Inf") }
' Sample1_RVDB_sort_unique.txt

또는 유사합니다.

답변3

사용행복하다(이전 Perl_6)

~$ raku -ne 'my @a = .words; put join "\t", @a, (@a[3]/@a[12])*100, (@a[3]/@a[13])*100;'   file

입력 예:

utg000001l  acc|GENBANK|MH883318.1|White    80.263  608 99  16  282 877 184245  184843  4.44e-120   438 2022    270609

예제 출력:

utg000001l  acc|GENBANK|MH883318.1|White    80.263  608 99  16  282 877 184245  184843  4.44e-120   438 2022    270609  30.069238   0.2246784

위 내용은 Perl 계열의 프로그래밍 언어인 Raku로 작성된 답변입니다. 명령 -ne줄 플래그는 Raku에게 자동이 아닌 인쇄 모드에서 입력에 대해 코드를 한 줄씩 실행하도록 지시합니다("n"은 "not"을 의미함).

루틴을 사용하면 공백에서 입력이 손상됩니다 words. 이 코드는 where is Raku(및 Perl)의 "테마 변수"의 약어이며 .words이 경우 입력 라인으로 설정되었습니다.$_.words$_

입력은 배열에 할당되고 @a입력은 추가 열( \t탭으로 결합)로 계산/출력됩니다. Perl/Raku는 0 인덱스임을 기억하세요.

https://raku.org

관련 정보