の最後の行を除いて、カンマ。私は実際に複数の列の値を1つの行に書き込んでいます。しかし、私が最後の行にいない場合にのみ、カンマを印刷したいと思います。
答えて
私は、スクリプトを実行する前に行数を見つけることでそれを行います。 coreutilsとbash:
awk -v nlines=$(wc -l < $a) '{printf "%s", $1"-"$2} NR != nlines { printf ", " }' $a >>positions
ファイルに2列しかない場合は、次のようなcoreutilsの代替も有効です。例えばデータ:
paste <(seq 5) <(seq 5 -1 1) | tee testfile
出力:
1 5
2 4
3 3
4 2
5 1
すぐ改行とタブを置き換え、paste
は容易に所望の形式に日付を組み立てる:
<testfile tr '\t' '\n' | paste -sd-,
出力:
1-5,2-4,3-3,4-2,5-1
ここでのcoreutilsに頼ることなく、より良い方法です:
awk 'FNR==NR { c++; next } { ORS = (FNR==c ? "\n" : ", "); print $1, $2 }' OFS="-" file file
これはThorのものよりもなぜ優れていますか?あなたはいつawkを持っていますが、wcは持っていませんか? –
@ MichaelJ.Barber:壊れたインストールは簡単な答えです。それにもかかわらず、最初のパスに 'wc -l <file'をエミュレートするコードを書くだけで、2回目のパスで必要に応じて' ORS'を操作するのははるかに面倒です。簡単です。また、あなたの答えは不完全です。 'END'ブロックにもう1つのprintステートメントが必要です。これは、EOFに改行文字がないことを修正するためです。それは本当に何もしない3つのプリントステートメントです。大きなファイルでは、あなたのアプローチは遅くなります。 Sarathiの答えは、各行がメモリに追加され、それが理想的ではないため、非常に大きなファイルでは遅くなります。 – Steve
また、本当に1つだけが必要な場合、Thorは2つのprintステートメントを使用しています。彼は、必要なものが書き直されたときに迅速な修正を加えました。 HTH。 – Steve
シングルパス・アプローチ:私は、文字列の書式設定を簡素化しました
cat "$a" | # look, I can use this in a pipeline!
awk 'NR > 1 { printf(", ") } { printf("%s-%s", $1, $2) }'
注意。
ちょっと見て、あなたは 'awk <" $ a "'Nr ...''を使うこともでき、それは1つのプロセス(猫なし)で動くでしょう! –
@KrzysztofJabłoński「cat」の使用に対する熱狂的な憎しみは、ここでは厳然としていますが、あなたの選択肢はそのポイントを完全に逃しています。他の答えは、ここで示したパイプラインでの使用を許可しなかったマルチパスの手法に依存していました。 –
パイプラインでの使用状況を表示することが目的であることに同意します。明らかに、私はその目的のために 'cat'の使用に同意しません。あまりにもしばしば私は、その謙虚な命令がパイプラインを始めることに慣れているのを見ます。このアイデアを説明するために、私は 'dataGeneratorCmd | dataFilterCmd | awk '...' | terminalConsumerCmd'。しかし、それは好みと好みの問題です。とにかく、怒らないでください。これはまだかなり包括的な答えです。 +1 –
awk '{a[NR]=$1"-"$2;next}END{for(i=1;i<NR;i++){print a[i]", " }}' $a > positions
、このいずれかをお楽しみください:
awk '{printf t $1"-"$2} {t=", "}' $a >> positions
葉、一見少しトリッキーに見えます。だから私は、説明のは、明確にするためprint
にprintf
を変更でき、すべての最初ます:
awk '{print t $1"-"$2} {t=", "}' file
、それが何を見て、例えば、この単純なコンテンツを持つファイルのために:
1 A
2 B
3 C
4 D
ので、それは次のように生成されます。
1-A
, 2-B
, 3-C
, 4-D
トリックは、初めに空である、先行するt
変数です。変数はと表示された後の処理の次のステップでのみ{t=...}
に設定されます。したがって、我々が(awk
)反復を続けるなら、我々は所望のシーケンスを得るでしょう。
あなたの回答は低品質レビューキューに表示されました。あなたの答えを編集して、この仕組みの説明を含めてください。 –
この解決法は、awkの前に行数が計算できない、または計算が難しいため、受け入れられた答えよりも優れています。たとえば、空行に遭遇した場合にwakeを終了させる場合は、 – leftjoin
これはいいですが、ヘッダー行をスキップする条件に基づいて行を印刷すると、最初の行をスキップした後で動作しないので、 't' gots割り当てられた。 '{t ="、 "}"と同じ条件を使うことで動作しますが、私にとっては少し汚れているようです。例: '$ 1〜/^[0-9] * $/{print t $ 1} $ 1〜/^[0-9] * $/{t ="、 "}'クリーナーソリューションはありませんか? – r1verside
あなたはAWKのORSとOFSは、これを処理する合理的な方法だろうと思うかもしれない:
$ awk '{print $1,$2}' OFS="-" ORS=", " input.txt
しかし、入力が最後の行に改行が含まれているため、これは、最終的なORSになります。改行はレコードセパレータなので、awkの観点からは入力に空の最後のレコードがあります。これを回避するには、ちょっとした騒ぎで作業することができますが、結果として複雑さが増すと、1ライナーの優雅さが失われます。
ここにこれを取ります。あなたが「複数の列の値を書いている」と言っているので、ORSとOFSを使っていないと問題が起こる可能性があります。したがって、フォーマットを使用して完全に目的の出力を得ることができます。
$ cat input.txt
3 2
5 4
1 8
$ awk '{printf "%s%d-%d",t,$1,$2; t=", "} END{print ""}' input.txt
3-2, 5-4, 1-8
これはマイケルのとルークのシングルパスのアプローチに似ていますが、それは、単一のprintf
を使用して、正しくフォーマットするためのフォーマット文字列を使用しています。
これはマイケルのソリューションよりも無視できるほど優れていると思われます。なぜなら、ファイルの読み込みが一度だけで済むため、割り当てはテストよりもCPU消費が少なく、マルチパスソリューションよりもはるかに優れているからです。
- 1. AWK:私はこの単純な<code>awk</code>コードを持っているユーザー入力
- 2. が私のWebページ</p> <pre><code><div id="clickable"> <a href="hello.com">Here!</a> </div> </code></pre> <p>に、私は次のセットアップを持っているHTMLアンカータグ
- 3. ... <p><a href="https://i.stack.imgur.com/g7lSe.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/g7lSe.png" alt="enter image description here"></a></p> <p></p>が、私は以下のコードを試してみました。.. CollectionViewコントローラ画像以下のような
- 4. 高度なMySQLは:</p> <p><strong>ユーザー</strong>(ID、名前)<br> <strong>ポーリング</strong>(ID、テキスト)<br> <strong>オプション</strong>(ID、poll_id:私は4つのMySQLのテーブルを持っている
- 5. なぜ[:] = 1は[:] = '1'と根本的に異なるのですか? <code>a</code>が<code>['1']</code>ある最初のケースで</p> <pre><code>a = [] a[:] = '1' </code></pre><p>と</p> <pre><code>a = [] a[:] = 1 </code></pre><p>:
- 6. のSubversion:私は</p> <p><a href="http://www.epocalipse.com/images/v_review_changes.png" rel="nofollow noreferrer">alt text http://www.epocalipse.com/images/v_review_changes.png</a></p> <p>今:レビューは
- 7. 顧客の色は、我々は<code>expression</code>以下で使用<code>expression.</code></p> <p>に基づいて日付の値を示し、私たち<code>SSRS</code>レポートの列を持っている
- 8. 修正ポイント機能は<code>Control.Monad.State</code>、<code>fix :: (a -> a) -> a</code>から、私は<code>modifyValue</code>にこの小さなコードを持って、<code>fix</code>機能を理解するよう
- 9. アトム - <kbd>ALT</kbd> - - アトムで<kbd>=</kbd>
- 10. 私は私がこれをクリックすると</p> <p><code><li><a href="#two" class="button" id="Button123">Text</a></li></code></p> <p>、マイページ</p> <p>にダウンした私は、コードの一部を持っている
- 11. Postgresはによってタプルを見つけて、私は2つのテーブル</p> <p><strong>テーブル</strong><br> ID <br> タイトル<br> 年</p> <hr> <p><strong>表B</strong><br> ID <br> を持っている他のテーブル
- 12. RavenDb静的インデックス:</p> <p><code>Employer => Positions => RequiredSkills</code></p> <p>雇用者が<br> ポジションRequiredSkillのコレクションを持っているポジションのコレクションを持っている:子コレクションのクエリは
- 13. グループ連続は私が持っているクラスを持っている<code>List<DateTime> dates;</code></p> <p>を持って
- 14. のXpath - チェックすべての要素がサブ要素を持つ文書</p> <pre><code><a> <b> <c/> <d/> </b> <b> <c/> <d/> </b> </a> </code></pre> <p>考える
- 15. GIT:私は2本の<em>枝<a href="https://bitbucket.org/anyulled/sisco/" rel="nofollow">Bitbucket</a>で作成</em>、<strong><em>マスター</em></strong>と他と呼ばれる<strong><em>モジュロcontratos</em></strong>と呼ばれるものを持っているのNetBeans
- 16. Ninjectコンテキストは、私は一般的なインタフェース<code>IRepository<T></code>との2つの実装<code>xrmRepository<T></code>と<code>efRepository<T></code></p> <p>を持っているワット/オープンジェネリック
- 17. 私は多次元配列に格納したい私は</p> <p>アレックスNAME</p> <p>ロンドンCITYのテキストファイルを持っている
- 18. 私は形でマルチファイルアップロードコントロールの<strong><em>N</em></strong>番号を持っているMVC
- 19. 私は列<strong>ID</strong>、<strong></strong>、および<strong>B</strong>を持っているMySQLの
- 20. は、私は2つのプロジェクト<strong>OSBのEclipse</strong>上<strong></strong>と<strong>B</strong>を持っている日食
- 21. 新しいタブで開いているURLまたは今私はリンク</p> <pre><code><a href="blabla" target="_blank">link</a> </code></pre> <p>を持っている1、可能な限り
- 22. 私は3つのクラス(<strong>カー</strong>(スーパー)、<strong>CarToRent</strong>、および<strong>CarToSell</strong>を持っているJavaの
- 23. 私はこの</p> <pre><code>console.log(document.getElementsByClassName('value')[0].innerHTML); </code></pre> <p>を持っている他のページから
- 24. は、どのように私は、変数</p> <pre><code>int x = 2; </code></pre> <p>とリストを持っている
- 25. ソート私はこれらのヘッダ内<code>string</code> Sを使用<code>Header</code> s.Ifとして<code>StackPanel</code> Sを含んでい<code>List</code><code>TreeViewItem</code>のSを持って孫
- 26. は</p> <p>は、inputfileの</p> <pre><code>SOMETHING {}; </code></pre> <p>によって</p> <pre><code>EXTRATHING { }; </code></pre> <p>を置き換える私は単純に次の操作を行いたい
- 27. ファイルリダイレクトVS.</p> <pre><code>while(<>){ print; } </code></pre> <p>と私はこのようにリダイレクトしてファイルに渡す必要があります考えています:<code>./sort.pl < wordlist</code>を、それが持っている私はそうのようないくつかのファイルからSTDINにかかる<code>sort.pl</code>という名前のperlスクリプトを持って
- 28. は、私は、この種の機能</p> <code>alpha</code>、<code>beta</code>、<code>A_i</code>と<code>B_i</code>は実数である<pre><code>f(x)=alpha+beta \sum_i A_i/(x-B_i) </code></pre> <p>を持っている機能
- 29. のLINQのINステートメントは、私は2つのテーブル</p> <p><strong>契約</strong></p> <p>IDを持って
- 30. 私のアプリを構築するAndroidのデバイスアーキテクチャは何ですか?私がすべき</p> <ul> <li>armeabi</li> <li>armeabi-v7a</li> <li>のx86</li> </ul> <p>何アーキテクチャ(S):Android用
ありがとうございました! – Perlnika
FYI、この 'tr'と' paste'の使用法は、POSIX環境で動作するはずです。GNU coreutilsに限られていません。 – ghoti