交互にテキストを貼り付ける

交互にテキストを貼り付ける

「main」と「rename」という2つのファイルがあるとします。 「rename」ファイルには、「main」ファイルの代替行に名前を追加するために使用される複数の行があります。 (「名前変更」の位置基準)

別のファイルの行をリンクするために使用しましたが、pasteこの状況に閉じ込められました。

コピー&ペーストを使用せずにこれを行う他の方法はありますか? (Ubuntu Linux 18.04で簡単に使用できるコマンドを使用することをお勧めします。)

ファイル「マスター」

#
stars
#
twinkle
#
on
#
the
#
sky

ファイル「名前の変更」

yellow
white
green
red
blue

希望の出力

#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

答え1

Awk両方のファイルを処理してそれを繰り返す間、あるファイルコンテンツはシステムメモリに、他のファイルコンテンツはシステムメモリに保持することによってそれを使用できます。

awk 'FNR==NR{ words[NR]=$0; next}{ if ($0 ~ /^#/) $0 = $0 words[++idx];  print }' rename main

動作原理の簡単な説明

  • このセクションは、配列内のファイルの内容にインデックスを付けることによって最初のファイルFNR==NR{ words[NR]=$0; next}に対して機能します。現在行番号を追跡するために使用される特殊変数です。だから配列は次のようになりますrenamewordsNRAwkwords['1']="yellow", words['2']="white"
  • {..}現在の部分は次のファイルに適用され、rename行が一致すると生成された配列の要素を追加して現在の行を更新します#$0
  • このコマンドで始まる行の場合、printコマンドは文字列が追加された行を印刷し#、他の行はそのまま印刷します。

答え2

一度電話すればpaste簡単に終了できます。

<main paste -d '\0\n' - rename -
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-dに渡された区切り文字のリストに複数の区切り文字が使用されている場合、これらの区切りpaste文字はすべて使用されるまで引き続き使用され、再起動されます。上記のコマンドで渡される2つの区切り文字は、\0(空の文字列)と\n(改行)です。標準入力はファイルを指し、ファイルは2つのコマンドを介してmain2回参照され-、すべて次の出力ラインが生成されます。

  1. mainから行に乗って
  2. 空の文字列を追加
  3. 次の行をインポートしてrename上に追加します。
  4. 次に上に改行文字を追加します。
  5. 1行を追加してループを完成させる main

など。

答え3

使い方はこんな感じです生地。関心のある行が平行に実行されるように、2番目のファイルの行間隔を2倍にすることから始めます。次に、デフォルトでは空白として表示されない \0 または NUL 値を使用して行を一緒に貼り付けます。出力スペースを2倍にするために使用できるさまざまな方法がありますが、貼り付けが便利です(例:sed言及したように、*他の人は参照してください出力ストリームで改行を2倍にする方法)。

二重間隔で並べ替えることができることを示す2つのソースファイルが表示されます。デフォルトの区切り文字を使用して2つのファイルを貼り付けると、ソートが表示されます。実際の答えは2つの方法です。 1つは一時ファイルを使用する標準的な方法であり、2つ目はプロセス置換を使用することです。

以下はスクリプトの断片です。

FILE1=${1-data1}
shift
FILE2=${1-data2}
E="expected-output"

# Utility functions: print-as-echo, print-line-with-visual-space.
pe() { for _i;do printf "%s" "$_i";done; printf "\n"; }
pl() { pe;pe "-----" ;pe "$*"; }

pl " Input $FILE1 and $FILE2, columnized to save visual space:"
paste $FILE1 $FILE2 | expand -30

pl " Expected output:"
cat $E

rm -f t0
pl " Results, paste with double-space $FILE2, default options:"
# sed '/^$/d;G' $FILE2 > t0
paste -d '\n' - /dev/null < $FILE2 > t0
paste $FILE1 t0

pl " Results with paste of NUL, \0:"
paste -d'\0' $FILE1 t0

pl " Results with paste, process substitution:"
paste -d'\0' $FILE1 <( sed '/^$/d;G' $FILE2 )

生産:

 Input data1 and data2, columnized to save visual space:
#                             yellow
stars                         white
#                             green
twinkle                       red
#                             blue
on                            
#                             
the                           
#                             
sky                           

-----
 Expected output:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-----
 Results, paste with double-space data2, default options:
#       yellow
stars
#       white
twinkle
#       green
on
#       red
the
#       blue
sky

-----
 Results with paste of NUL, \0:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

-----
 Results with paste, process substitution:
#yellow
stars
#white
twinkle
#green
on
#red
the
#blue
sky

これは以下のシステムで行われた。

OS, ker|rel, machine: Linux, 3.16.0-7-amd64, x86_64
Distribution        : Debian 8.11 (jessie) 
bash GNU bash 4.3.30
paste (GNU coreutils) 8.23

乾杯、drl

関連情報