貼り付けコマンドに改行を追加しようとしています

貼り付けコマンドに改行を追加しようとしています

以下は、改行を挿入しようとする貼り付けコマンドの弱い試みです。

    paste -d -s tmp1 tmp2 \n tmp3 \n tmp4 tmp5 tmp6 > tmp7

基本的に各tmpに複数の行があり、出力は次のようになります。

First(tmp1) Last(tmp2)
Address(tmp3)
City(tmp4) State(tmp5) Zip(tmp6)

貼り付けコマンドで改行を使用するのは的外れでしょうか?

これが私の完成品です: ご協力ありがとうございました!

    cp phbook phbookh2p5

    sed 's/\t/,/g' phbookh2p5 > tmp
    sort -k2 -t ',' -d tmp > tmp0
    cut -d',' -f1,2 tmp0 > tmp1
    cut -d',' -f3 tmp0 > tmp2
    cut -d',' -f4,5,6 tmp0 > tmp3
    echo "" > tmp4

    paste -d '\n' tmp1 tmp2 tmp3 tmp4 > tmp7

    sed 's/\t/ /g' tmp7 > phbookh2p5

    cat phbookh2p5

    rm tmp*; rm phbookh2p5

答え1

次の 2 つの追加一時ファイルを使用して、この解決策を試してください。

paste tmp1 tmp2 > tmp12
paste tmp4 tmp5 tmp6 > tmp456
paste -d "\n" tmp12 tmp3 tmp456 > tmp7

-dこの解決策は、オプションが区切り文字を選択するという仮定に基づいていました。世界的にすべての入力ファイルに対して空白かまたは改行。これは、後から出現したものが-d前のものを上書きするため、ある意味では正しいです。ただし、@DigitalTrauma が指摘したように、連続して使用される区切り文字を複数指定できます。したがって、@DigitalTrauma のソリューションは、追加の一時ファイルを完全に回避するため、私のソリューションよりもエレガントです。

私の解決策のニッチな応用例の1つは、1つまたは複数の区切り文字がそれぞれ1文字以上を使用する必要があります。このオプションを使用するだけではこれは不可能です-d

答え2

あなたが必要としているのは、man ページのこの部分だと思いますpaste:

   -d, --delimiters=LIST
          reuse characters from LIST instead of TABs

したがって、次のワンライナーがあなたのケースに有効です:

paste -d" \n\n  " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6 > tmp7

@DopeGhoti のサンプル データでは期待どおりに動作します。

$ grep . tmp*
tmp1:Bill
tmp1:Bob
tmp2:Kerman
tmp2:Germin
tmp3:123 Main St.
tmp3:321 Sesame St.
tmp4:Kerbopalis
tmp4:Kerbington
tmp5:Kerbskatchewan
tmp5:Kermont
tmp6:12345
tmp6:31416
$ paste -d" \n\n  " tmp1 tmp2 tmp3 tmp4 tmp5 tmp6
Bill Kerman
123 Main St.
Kerbopalis Kerbskatchewan 12345
Bob Germin
321 Sesame St.
Kerbington Kermont 31416
$ 

私はこれを GNU Coreutils 5.97 および 8.21 と BSD (OS X) で正常にテストしましたpaste。他にどのようなバージョンの paste が存在するかはわかりません。

答え3

このコマンドは動作するはずです。

 paste -s tmp1 tmp2 -d '\n' tmp3 -d '\n' tmp4 tmp5 tmp6 > tmp7

答え4

sort -dk2,2 phpbook |
sed "s/\t/\n/3;s//\n/2;s// /g"

phpbook私の理解では、次のような電話帳エントリの行で構成された というファイルがあります。

{first}\t{last}\t{address}\t{city}\t{state}\t{zip}

これらを でソートし、各エントリの{last}後に改行を追加し{last}、abs を に変換して、結果を に出力します。 そうでない場合、コマンドが他に何を行うのかわかりませんが、私は時々かなり鈍感なことがあります。 {address}\t<spaces>stdout

デフォルトでは文字sortで区切られることに注意してください。<TAB>

sed 's/\t/,/g' | sort ... -t ,

...おそらくやる価値はない。

もう少し考えてみると、区切り文字が混在していて、イニシャルはsedそれらを正規化することを意図している可能性が高いと思います。それは理にかなっています。おそらく次のようになります。

1,2\t3\t4,5,6

...とか。その場合は、何らかの初期翻訳が必要になります。だから、多分...

tr , \\t <phbook | sort ... | sed ...

少し良くなるでしょう。また...

sort ... -k 2

...かもしれないエッジケースでは問題になることがあります。なぜなら、それを使用するとsortのみ2番目のフィールドではなく、2番目のフィールドから行の終わりまでです。一般的に、人々がそうするとき、彼らは本当に望んでいるのは、-k2,2データが制限されることsortです。のみ2番目のフィールド。

次のようなセカンダリキーを追加することも価値があるかもしれません:

...sort -dk2,2 -k1,1

...それはsort 主に姓と二次的にファーストネームで。そのようにゼッド・スミス続くだろうアルファ・スミス毎回。

とにかく、万が一私が正しければ、上記のパイプラインですべてを実行できるはずです。私が使用したスケープを理解しているとsort | sed想定していますが、理解できない場合は、引用したスクリプトを次のように置き換えてみてください。sed\esed

s/<literal TAB>/\
/3;s//\
/2;s// /g

関連情報