한 파일의 단일 값 내용을 다른 파일에 추가 열로 추가합니다.

한 파일의 단일 값 내용을 다른 파일에 추가 열로 추가합니다.

두 개의 파일이 있습니다. 하나는 여러 열과 행을 포함하고 다른 하나는 하나의 값만 포함합니다.

  • 파일 1:
    abc def
    ghi jkl
    
  • 파일 2:
    hello
    

file1에서 찾은 값을 항상 포함하는 다른 열을 추가하고 싶습니다 file2. 따라서 출력은 다음과 같아야 합니다.

abc def hello
ghi jkl hello

누구든지 내가 이 일을 하도록 도와줄 수 있나요?

답변1

파일의 마지막 줄을 가져온 tail다음 각 줄과 변수를 인쇄하도록 awk지시하는 외부 변수로 전달할 수 있습니다.awk

$ awk -v s="$(tail -n1 file2)" '{print $0,s}' file1
abc def hello
ghi jkl hello

file2tail -n1 file이는 i) 의 마지막 줄을 원하고 ; 그렇지 않은 경우 로 바꿀 수 있고 cat "$file"ii) file2이스케이프 시퀀스를 포함하지 않는다고 가정합니다(참조).awk 스크립트에서 쉘 변수를 사용하는 방법은 무엇입니까?우수한).

답변2

이것은 문자열이 무엇이든 상관없이 작동합니다 file2.

$ awk 'NR==FNR{x=$0; next} {print $0, x}' file2 file1
abc def hello
ghi jkl hello

또는 원하는 경우 file2의 문자열에 백슬래시를 포함할 수 없습니다( -v이스케이프 시퀀스 설명).

$ awk -v x="$(< file2)" '{print $0, x}' file1
abc def hello
ghi jkl hello

차이점은 다음과 같습니다.

$ cat file2
hello\there

$ awk 'NR==FNR{x=$0; next} {print $0, x}' file2 file1
abc def hello\there
ghi jkl hello\there

$ awk -v x=$(< file2) '{print $0, x}' file1
abc def hello   here
ghi jkl hello   here

답변3

여기에 추가하는 상수 문자열이므로 sed를 사용하는 것을 생각할 수 있지만 추가하는 문자열은 sed의 명령줄에 포함되어 있으므로 sed가 특별히 처리하는 것은 있는 그대로 수행되지 않습니다. 예를 들어 a는 명령을 /종료하는 데 사용되며 패턴 부분으로 대체됩니다.s///&

$ str=$(cat file2)
$ sed -e "s/\$/ $str/" file1
abc def hello
ghi jkl hello

예를 들어 토론을 참조하십시오.슬래시가 포함될 수 있는 파일에서 처음 나타나는 패턴을 바꿉니다.

awk와 유사하지만 생각만큼 내용 독립적이지는 않지만 settings 를 사용하는 문자열의 경우 -vawk는 C 스타일 백슬래시 이스케이프 처리를 처리하므로 문자열이 foo\tbar원하는 대로 될 수도 있고 아닐 수도 있습니다.foo[tab]bar

$ str=$(cat file2)
$ awk -v str="$str" '{print $0 " " str}' < file1
abc def hello
ghi jkl hello

예를 들면 다음을 참조하세요.awk에서 쉘 변수 사용


또는 약간 Rube Goldberg와 비슷하지만 다른 도구를 사용할 수도 있습니다. 제가 이런 결정을 내리게 된 이유가 무엇인지 모르겠습니다.

$ paste file1 <( yes "$(cat file2)" ) | head -n "$(wc -l < file1)"
abc def hello
ghi jkl hello

답변4

Raku(이전 Perl_6) 사용

raku -e 'my $str="/path/to/file2".IO.lines(1); .subst(/(^.*$)/, {$0,$str}).put for lines;' file1

즉, 첫 번째 줄(아마도 유일한 줄)을 file2변수로 읽은 $str다음 file1한 줄씩 분석하여 각 줄의 끝에 심지어 빈 줄까지 subst추가(실제로 추가)합니다 . $str문자가 포함된 줄 끝에 "hello"만 추가하도록 동작을 변경하려면 (^.*$)로 변경하세요 (^.+$).

입력 예:

  • 파일 1:
    abc def
    ghi jkl
    
  • 파일 2:
    hello
    

예제 출력:

abc def hello
ghi jkl hello

file1Raku가 입력을 처리하도록 합니다 file2(쉘 변수를 통해 전달하는 대신).~해야 한다입력을 적절하게 이스케이프하는 것에 대한 많은 걱정을 제거합니다.

https://docs.raku.org/routine/subst
https://www.raku.org

관련 정보