동일한 줄을 두 개의 다른 파일에 인쇄하고 싶습니다. 내가 지금 하고 있는 일은:
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.txt
3
매우이것은 작동 방식에 대한 기본적인 예이지만 샘플 입력을 제공할 수 있다면 조금 더 잘할 수 있을 것입니다.
쓰기 위해 파일을 열면 프로세스가 완료될 때까지 열린 상태로 유지됩니다. 쓰기를 위해 계속 sed
해서 파일 자체를 자르지는 않습니다. 파일 설명자는 프로세스 수명 동안 열린 상태로 유지됩니다.