98

たとえば、私はファイルを持っています:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

そして私は必要です:

example, line, file

i intent with "awk" but the problem is that the words are in different space

4

6 に答える 6

104

試す

$ awk 'NF>1{print $NF}' file
example.
line.
file.

例のように 1 行で結果を取得するには、次を試してください。

{
    sub(/\./, ",", $NF)
    str = str$NF
}
END { print str }

出力:

$ awk -f script.awk file
example, line, file, 

純粋なバッシュ:

$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.
于 2013-05-17T20:05:46.387 に答える
93

grep で簡単に実行できます。

grep -oE '[^ ]+$' file

(-E拡張正規表現を使用します。-o行全体ではなく、一致したテキストのみを出力します)

于 2013-05-18T05:05:48.053 に答える
44

awk で次のようなことができます。

awk '{ print $NF }'

編集:空行を避けるには:

awk 'NF{ print $NF }'
于 2013-05-17T20:05:00.647 に答える
16

単純な bash でこれを行う別の方法は、rev次のようなコマンドを使用することです。

cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

基本的に、ファイルの行を反転し、区切り文字としてスペースを使用してそれらを分割し、生成cutされる最初のフィールドを取得してcutから、トークンを再度反転し、tr -d不要な文字を削除trし、改行文字を再度置き換えます,

また、次のようにして、最初の猫を回避できます。

rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","
于 2013-05-18T00:09:01.563 に答える
9

tldr;

$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'

このようなファイルの場合

$ cat file.txt
The quick brown fox
jumps over
the lazy dog.

指定されたコマンドが出力されます

fox, over, dog.

使い方:

  • awk '{print $NF}': すべての行の最後のフィールドを出力します
  • paste -sd,stdin:連続して読み取り( -s、一度に 1 ファイル)、フィールドをコンマ区切りで書き込みます ( -d,)
  • sed 's/,/, /g': slobally","", " g置き換えます (すべてのインスタンスに対して)

参考文献:

于 2016-03-16T17:50:36.030 に答える
8

多くの方法があります。ソリューションが示すようawkに、それはクリーンなソリューションです

sed ソリューションは、最後のスペースまで何かを削除することです。したがって、最後にスペースがない場合は機能するはずです

sed 's/.* //g' <file>

回避してループsedに行くこともできます。while

while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file

それは行を読み、それを尊重し、最初の行(つまり、元の最後の行)を切り取り、元に戻します

純粋なbashの方法でも同じことができます

while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file

それはパラメータ拡張と呼ばれます

于 2013-05-17T20:26:40.723 に答える