貼り付けコマンドに改行文字を追加してみてください。

貼り付けコマンドに改行文字を追加してみてください。

以下は、改行を含む貼り付けコマンドの弱い試みです。

    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つ以上の文字使用する必要があります。このオプションだけでは不可能です-d

答え2

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
$ 

paste私はGNU Coreutils 5.97と8.21とBSD(OS X)を使って正常にテストしました。異なるバージョンのペーストがあるかどうかはわかりません。

答え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}てから改行を追加し、各項目に対してABSをに変換してから結果をとして印刷しようとしています。そうでなければ、あなたのコマンドが何をするのかわかりません。しかし、時には非常に密になることがあります。 {last}{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理解すると仮定し\eますが、そうでない場合は、sed引用したスクリプトを次のように置き換えることができます。

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

関連情報