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

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

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

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'

1그러면 a 가 포함된 행만 작성되고 onesfile.txt그렇지 않으면 for 3- 다른 모든 내용은 삭제됩니다. 이것은매우이것이 어떻게 작동하는지에 대한 기본적인 예이지만 샘플 입력을 제공할 수 있다면 좀 더 잘할 수 있습니다.

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

관련 정보