다음 코드를 사용하여 다른 기존 열의 계산을 기반으로 탭 구분 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 인덱스임을 기억하세요.