임시 파일을 사용하지 않고 첫 번째 매개변수에 결과를 붙여넣고 저장합니다.

임시 파일을 사용하지 않고 첫 번째 매개변수에 결과를 붙여넣고 저장합니다.

paste원본 파일 "first.xls"에 새 열을 추가하는 데 사용하고 싶습니다 . 내 파일:

first.xls

1
1
1

second.xls

2
2
2

나는 다음을 사용하고 있습니다 :

paste -d'\t' first.xls  second.xls >> first.xls

나는 얻다
first.xls:

1
1
1

1 2
1 2
1 2

하지만 내가 원하는 것은
first.xls:

1 2
1 2
1 2

first.xls처음부터 덮어쓰고 싶은 새 파일 에 저장하고 싶지 않습니다 . 스크립트를 실행할 때마다 새 열이 추가되도록 새 열을 최종 결과에 붙여넣고 싶기 때문에 이것이 필요합니다.

1 2 2
1 2 2
1 2 2

그 다음에

1 2 2 2
1 2 2 2
1 2 2 2

등...

답변1

사용스펀지~에서더 많은 유틸리티팩:

paste -d'\t' first.xls  second.xls | sponge first.xls

man sponge

스펀지표준 입력을 읽고 지정된 파일에 씁니다. 쉘 리디렉션과 달리 스폰지는 출력 파일을 열기 전에 모든 입력을 흡수합니다. 이를 통해 동일한 파일을 읽고 쓰는 파이프를 제한할 수 있습니다.

답변2

나는 당신이 이것을 혼자서 할 수 있다고 생각하지 않습니다 paste.

나는 이렇게 할 것이다:

paste -d' ' first.txt second.txt > tmpout && mv tmpout first.txt

첫 번째 실행 후 결과:

cat first.txt                   
1 2
1 2
1 2

두 번째 실행 후:

cat first.txt 
1 2 2
1 2 2
1 2 2

...세 번째 실행:

cat first.txt 
1 2 2 2
1 2 2 2
1 2 2 2

답변3

대체 솔루션awk

$ seq 3 > first.xls
$ seq 4 6 > second.xls

$ awk -v OFS="\t" 'NR==FNR{a[NR]=$0; next} {print a[FNR], $0 > "first.xls"}' first.xls second.xls 
$ cat first.xls 
1   4
2   5
3   6

$ awk -v OFS="\t" 'NR==FNR{a[NR]=$0; next} {print a[FNR], $0 > "first.xls"}' first.xls second.xls 
$ cat first.xls 
1   4   4
2   5   5
3   6   6

답변4

또 다른 답변에서 알 수 있듯이 스펀지는 작업에 적합한 도구입니다!

sudo yum install moreutils
paste first.xls second.xls | sponge first.xls 

tee를 사용하는 bash 명령은 작은 파일(<2048줄)에 작동합니다.

참고: 이 팁은 더 큰 파일에는 적용되지 않습니다.

paste first.xls second.xls | tee first.xls >/dev/null

first.x second. result
1       2       1       2
1       2       1       2
1       2       1       2

이 명령은 두 파일 모두에 대해 붙여넣기를 실행한 다음 "tee"로 파이프합니다.tee 명령은 쓰기 위해 파일(및 표준 출력)을 다시 엽니다.. 그래서 작동합니다. . 그러나 그것은 약간 해킹과 같습니다. . 모든 시스템에서 작동하나요? 대용량 파일에도 적용되나요?

정확히 동일하지는 않지만 관련된 질문을 여기에서 확인하세요. https://stackoverflow.com/questions/1569730/paste-without-temporary-files-in-unix

문제는 명령이 동시에 쓰기(추가) 및 읽기를 위해 first.xls를 여는 것입니다. 파일에서 데이터를 읽은 다음 다른 파일과 붙여넣습니다. 그런 다음 출력 데이터가 파일에 기록(추가)됩니다. 새로 작성된 데이터를 다시 읽어서 예상대로 추가합니다. 추가 명령:

paste first.xls second.xls >> first.xls

first.x second. result
1       2       1
1       2       1
1       2       1
                1       2
                1       2
                1       2

오버레이를 켜도록 리디렉션을 변경해도 작동하지 않습니다. 읽기 전에 first.xls가 열리고 지워집니다. 빈 열 + 2개의 열이 표시됩니다. 추가 대신 덮어쓰기는 다르게 작동하지 않습니다.

paste first.xls second.xls > first.xls

first.x second. result
1       2               2
1       2               2
1       2               2

더 큰 파일 테스트

1000줄에 유효함:

yes "1" | fmt -2 |head -1000 >1000.1
yes "2" | fmt -2 |head -1000 >1000.2
paste 1000.1 1000.2 |tee 1000.1 >/dev/null
uniq -c 1000.1 
 1000 1 2

10000번째 줄에서 비슷한 문제가 다시 나타나기 시작합니다.:

흥미롭게도 2048라인 이후에 이 내용이 표시됩니다. :-) 디스크 버퍼 제한이나 파이프 버퍼 제한으로 인해 발생한 것으로 추측됩니다. . .

yes "1" | fmt -2 |head -10000 >10000.1
yes "2" | fmt -2 |head -10000 >10000.2
paste 10000.1 10000.2 |tee 10000.1 >/dev/null
uniq -c 10000.1 
 2048 1 2
 7952   2

관련 정보