
互いに下にある単語のリストを含むファイルがあります。ここで言葉は一つの文に属し、次の文に属する単語も互いに下にある。以下の表現#2に示すように、文に関連する単語ブロックの後にスペースが続きます。
期待される出力: (#1を意味する):
These are the words for sentence 1
These are the words for sentence 2
期待される入力:(#2の場合):
These
are
the
words
for
sentence 1
these
are
the
words
for
sentence 2
追いかけようとするこの問題しかし、文ごとに異なる単語を使用すると動作しませんが、Linuxで表現番号2を表現番号1にどのように変更できますか?
答え1
$ awk -v RS= '{$1=$1}1' file
These are the words for sentence 1
these are the words for sentence 2
答え2
awkを使用してください:
awk 'BEGIN { RS = "" } {gsub(/ *\n */, " "); print}' FILE
答え3
正規表現モードでGNU sedエディタを展開し、予約済みスペースを使用して空でない行を保存します。
sed -Ee 's/^\s+|\s+$//g
/./{H;$!d;}
x;s/.//;y/\n/ /
' file
別の方法は、awk予約語を使用することです。
awk -v RS= '
BEGIN{FS=ORS}
{$1=$1}1
' file
答え4
$ perl -00 -aE 'say join " ", @F' input.txt
These are the words for sentence 1
these are the words for sentence 2
-00
Perlに短絡モードでファイルを読み取るように指示します(段落は1つ以上の空白行に分かれています)。-a
Perlに入力を空白の配列に自動的に分割するように指示します@F
(awkが入力を自動的に$ 1、$ 2、$ 3などに分割する方法に似ています)。-a
このオプションも暗黙的に設定され、-n
Perlが次のように動作しますsed -n
(自動印刷せずにすべての入力を読み取る)。-p
このオプション(-nなしでsedのように変更できる入力を自動的に印刷)は、コマンドラインにオプションを追加することで無視できます。-E
印刷後に自動的に新しい行を追加する機能など、スクリプトのすべてのオプション機能を有効にするのは少し簡単です(say
代わりに使用する場合はprint join(" ", @F), "\n"
これを行う必要があります)。-e
-E
say
Perlは長い間使用されており、デフォルトで有効にする必要がありますが、Perl開発者は、say
独自の機能を定義する古いスクリプトが破損する危険性があるため、数十年前にそうしないことにしました。この
join()
関数は配列要素を@F
スペースで連結します。
代わりに、出力フィールド区切り記号($,
)を設定することもできますjoin
。
$ perl -00 -aE 'BEGIN{$,=" "}; say @F' input.txt
These are the words for sentence 1
these are the words for sentence 2
デフォルトのOFSが空白文字のawkとは異なり、PerlのデフォルトのOFSは空で定義されていません。これにより、単語間にスペースを入れずに配列が印刷されます。
$ perl -00 -aE 'say @F' input.txt
Thesearethewordsforsentence1
thesearethewordsforsentence2
まさにあなたが望むものではありません。