새 파일을 쓰지 않고 두 파일을 "붙여넣기"하는 방법은 무엇입니까? [폐쇄]

새 파일을 쓰지 않고 두 파일을 "붙여넣기"하는 방법은 무엇입니까? [폐쇄]

나는 이것을하고있다

for pathname in /user/home/file_*; do
    cat "$pathname" | sed -n '3p'; printf"\n";
done> user/home/foo;

for pathname in /user/home/file_*; do
    cat "$pathname" | grep "word";
    printf"\n";
done> user/home/bar;

paste foo bar > combined

&를 combined쓰지 않고 직접 쓰는 방법은 무엇입니까 ? 디렉터리가 크기 때문에 실행 시간을 줄여보세요.foobar

나는 노력했다

for pathname in /user/home/file_*; do
    cat "$pathname" | sed -n '3p'; printf"\n";
done | paste > combined;

for pathname in /user/home/file_*; do
    cat "$pathname" | grep "word";
    printf"\n";
done | paste > combined;

하지만 첫 번째 목록을 덮어쓰게 됩니다.

답변1

죄송합니다. 질문을 오해했을 수도 있습니다. 함께 있을 수도 있음 https://stackoverflow.com/questions/31546680/how-to-pipe-grep-output-to-paste-input

Paste 명령은 스트림 대신 2개 이상의 파일을 사용하여 열 구조를 유지하고 결합된 파일에서 왼쪽에서 오른쪽으로 배치합니다. 왼쪽에서 오른쪽으로 열을 결합하려면 다음 링크가 흥미로울 수 있습니다. https://www.geeksforgeeks.org/paste-command-in-linux-with-examples/ "2. 다른 명령과의 조합" 항목에서는 "cut"과의 조합에 대해 설명합니다. file1에 탭으로 구분된 2개의 열이 있는 경우 file2에는 1개의 열이 있으며 연속 잘라내기 및 붙여넣기 파이프라인을 수행할 수 있습니다.

cut -d\      -f1-2 file1 | paste - file2 | cut -d\   -f1-3 | paste - file3

여기서 -d\ 뒤의 보이지 않는 문자는 탭 문자입니다(명령줄의 ctl-V 탭, 실제로 탭은 "붙여넣기"와 마찬가지로 "잘라내기"에 대한 기본 구분 기호일 수 있음). 각각 "붙여넣기" 뒤의 하이픈은 파이프 입력 스트림의 열 위치.

또는 모든 열이 보존되므로 다음과 같습니다.

cut -d\      -f1-2 file1 | paste - file2 | paste - file3

두 번째 파일의 모든 출력을 첫 번째 파일의 출력 아래에 넣으려면 하위 쉘을 사용하라는 원래 제안이 있습니다.

( source cmdLIST1.csh ; source cmdLIST2.csh ) > combinedOUTPUT.txt

유용할 수도 있습니다.

Chai의 답변은 "bash" 및 "zsh"에서는 작동하지만 "tcsh"에서는 작동하지 않는 것으로 보이며 아마도 가장 간단할 것입니다.

답변2

한 가지 방법은 awk를 호출하여 세 번째 줄 및/또는 단어가 포함된 줄을 인쇄하도록 요청하는 것입니다. 출력은 병합되어 한 번에 2줄씩 붙여넣어 merge라는 파일에 기록됩니다. 이는 단어가 한 번 발생한다고 가정합니다.

$ for pathname in /user/home/file_*; do
    awk '/word/;NR==3' < "$pathname" 
  done | paste  - - > combined

답변3

이 시도

$ paste <(for pathname in /user/home/file_*; do cat "$pathname" | sed -n '3p'; printf "\n"; done) <(for pathname in /user/home/file_*; do cat "$pathname" | grep "word"; printf "\n"; done)

하지만 내 생각엔 셸이 뒤에서 임시 파일을 사용하는 것 같아요.

답변4

for f in /user/home/file_*; do
    printf '%s\t%s\n' "$(sed -n '3{p;q;}' "$f")" "$(grep 'word' "$f")"
done > combined

파일이 큰 경우 sed에 종료 명령을 추가했습니다.

관련 정보