2つのファイルがあります。 1つは複数の列と行を含み、もう1つは1つの値のみを含みます。
- ファイル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
1file1
行ずつ分析して各行の最後にも空行までsubst
追加(実際に追加)します。$str
文字を含む行の末尾に「hello」のみを追加するように動作を変更するには、に(^.*$)
変更します(^.+$)
。
入力例:
- ファイル1:
abc def ghi jkl
- ファイル2:
hello
出力例:
abc def hello
ghi jkl hello
file1
Rakuに入力を処理させますfile2
(シェル変数を渡すのではなく)。しなければならない入力を適切にエスケープすることに関する多くの心配を排除します。