あるファイルの単一値の内容を別のファイルに追加の列として追加します。

あるファイルの単一値の内容を別のファイルに追加の列として追加します。

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

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変数として読み取り、$str1file1行ずつ分析して各行の最後にも空行まで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

関連情報