두 개의 파일이 있습니다. 하나는 여러 열과 행을 포함하고 다른 하나는 하나의 값만 포함합니다.
- 파일 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
file2
tail -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 를 사용하는 문자열의 경우 -v
awk는 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
file1
Raku가 입력을 처리하도록 합니다 file2
(쉘 변수를 통해 전달하는 대신).~해야 한다입력을 적절하게 이스케이프하는 것에 대한 많은 걱정을 제거합니다.