2

私は次のことをしたいのですが、awkでこれを行う方法がわかりません。列数が 4 未満の場合は、次の行を追加する必要があります (8 列の行と一致するように)

aaa2 17 79285137 bbb3 0.23 A X 5
aaa2 17 79287477 
aaa2 1 F F 5 
aaa2 17 79291434 bbb33 1 G X 5
aaa2 17 79292215 bcs23 1 Q X 5
aaa22 4 4201745 
aaa22 1 C C 5
....

aaa2 17 79285137 bbb3 0.23 A X 5
aaa2 17 79287477 aaa2 1 F F 5 
aaa2 17 79291434 bbb33 1 G X 5
aaa2 17 79292215 bcs23 1 Q X 5
aaa22 4 4201745  aaa22 1 C C 5
....
4

4 に答える 4

3

この行を試してください:

awk 'NF<4{printf "%s", $0;next}1' file
于 2013-03-13T09:51:24.020 に答える
2

(編集:以前のバージョンを復元しました。そうしないと、従うのが難しくなります..)

もう1つ:

awk '{ORS=NF<4?x:RS}1' file

上記は、再結合された文の部分の間にフィールドセパレータが必要ない場合に使用できます。スペースを導入するものは次のとおりです。

awk 'ORS=NF<4?FS:RS' file

上記のオプションは OP のサンプル入力に対して機能しますが、結合する必要がある行のフィールドが 4 つ未満の場合 (たとえば、合計 2 x 3 フィールドの行を 6 つのフィールドを持つ 1 つの行に結合する必要がある場合)、これらのオプションは失敗します。上記のサンプルには当てはまりません)

そのため、このオプションを追加しました:

awk 'NF<4{getline $(NF+1)}1' file

Ed Morton の投稿への Dimitre のリンクを見ましたが、この場合、適用される実際のgetline警告はないと思います。NF が更新されないという事実は、このアプリケーションにとって問題ではありません。通常は getline の成功をテストしますが、ここではそれを省略しました。仮説的な状況で最終行のフィールドが 3 つ未満になると、入力ファイルが最初から壊れてしまい、ここで提供される解決策はどれも提供されないためです。 100%正解です。

于 2013-03-13T11:35:41.980 に答える
1
awk '{if(NF<4){x=$0;f=1;next}if(f){$0=x" "$0;f=0};print}' your_file

テスト済み:

> awk '{if(NF<4){x=$0;f=1;next}if(f){$0=x" "$0;f=0};print}' temp
aaa2 17 79285137 bbb3 0.23 A X 5
aaa2 17 79287477  aaa2 1 F F 5 
aaa2 17 79291434 bbb33 1 G X 5
aaa2 17 79292215 bcs23 1 Q X 5
aaa22 4 4201745  aaa22 1 C C 5
>
于 2013-03-13T09:56:39.107 に答える
1

この awk はあなたのために働くでしょう:

awk '{if (pre!="") {print pre $0; pre=""} else if (NF>=4) print; else pre=$0}' in.file
于 2013-03-13T09:54:05.553 に答える