인쇄 출력을 awk의 여러 파일로 리디렉션

인쇄 출력을 awk의 여러 파일로 리디렉션

동일한 줄을 두 개의 다른 파일에 인쇄하고 싶습니다. 내가 지금 하고 있는 일은:

print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file1.txt";
print ID[i]" "Value[i]" "TS1[i]" "TS2[i] > "file2.txt";

이를 두 개의 다른 파일로 리디렉션하는 명령을 작성할 수 있습니까?

편집하다

전체 명령 출력을 여러 파일로 인쇄하고 싶지 않고, 일부 조건에 따라 일부 레코드를 여러 파일에 쓰고 awk이를 스크립트로 인쇄하고 싶기 때문에 다음이 필요합니다.효율적인이를 수행하는 방법.

답변1

이 작업을 수행하는 데 사용할 수 없습니다 awk.

를 사용하면 tee다음을 수행할 수 있습니다.

$ awk '{print ID[i]" "Value[i]" "TS1[i]" "TS2[i]}' file | tee out1 out2

tee -a기존 파일을 덮어쓰는 대신 추가하려는 경우에 사용합니다.

전체 출력을 인쇄하지 않으려면 다음을 시도해 보세요.

awk '
    BEGIN {outfile["a.txt"];outfile["b.txt"]}
    { for (file in outfile) { print > file } }' file

답변2

파일로 리디렉션하는 대신 awk다음을 사용하여 명령으로 리디렉션할 수 있습니다 print "text" > "file".

print "something" | "tee file1.txt file2.txt"

명령은 처음 사용할 때 생성되고 |다음 awk번에는 동일한 명령을 재사용하므로 명령을 수행할 때마다 새 명령이 시작되지 않으며 파일을 덮어쓰지 않습니다(실제로 필요한 경우). tee다음에 시작할 때 새 명령을 호출해야 합니다.) 그러나 둘 다 수행하면 충돌이 발생합니다.close("tee file1.txt file2.txt")awk> "file1.txt"| "tee file1.txt..."

>> "file1.txt"그런 다음 대신 and를 사용하고 싶을 수도 있습니다 | "tee -a file1.txt...".

그래도 나는 선택하겠다@cuonglm의 for접근 방식또는 awk더 깨끗하고 효율적인 기능을 사용하십시오.

답변3

사용자 정의 함수코드를 더 깔끔하게 만들고 중복을 줄일 수 있습니다(문제인 경우).

function print_to_files( message, file_a, file_b ) {
   print message > file_a;
   print message > file_b;
}

message = sprintf( "%s %s %s %s", ID[i], Value[i], TS1[i], TS2[i] )
print_to_files( message , "filea", "fileb" );'

또는 원하는 경우 파일을 하드코딩할 수 있습니다.

function print_to_files( message ) {
   print message > "/path/to/filea";
   print message > "/path/to/fileb";
}

message = sprintf( "%s %s %s %s", ID[i], Value[i], TS1[i], TS2[i] )
print_to_files( message );'

답변4

사용할 수는 있지만 sed입력 내용을 더 명확하게 이해하지 않고 구체적으로 설명하는 방법을 모르겠습니다. 그럼에도 불구하고 일반적인 예는 다음과 같습니다.

seq 10 | sed -ne '/1/w ./onesfile.txt' -e '/3/w threesfile.txt'

그러면 a가 포함된 행만 다른 항목 1에 기록됩니다 . 다른 모든 항목은 삭제됩니다. 이것은onesfile.txt3매우이것은 작동 방식에 대한 기본적인 예이지만 샘플 입력을 제공할 수 있다면 조금 더 잘할 수 있을 것입니다.

쓰기 위해 파일을 열면 프로세스가 완료될 때까지 열린 상태로 유지됩니다. 쓰기를 위해 계속 sed해서 파일 자체를 자르지는 않습니다. 파일 설명자는 프로세스 수명 동안 열린 상태로 유지됩니다.

관련 정보