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