47

input(サンプル)は次のとおりです。

name1@gmail.com|com.emailclient.account
name2@msn.com|com.socialsite.auth.account

私はこれを達成しようとしています:

Emailclient name1@gmail.com
Socialsite name2@msn.com

このようにAWKを使用する場合:

cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}'

フィールド2の上にフィールド1をオーバーレイすることにより、出力を台無しにします。

ヒント/提案はありますか?ありがとうございました。

4

4 に答える 4

83

いくつかの一般的なヒント(DOS行の終了の問題以外)

catファイルを連結するためのものであり、ファイルを読み取ることができる唯一のツールではありません!コマンドがファイルを読み取らない場合は、のようなリダイレクトを使用しますcommand < file

-F次の代わりに、オプションでフィールドセパレータを設定できます。

cat foo | awk 'BEGIN{FS="|"} {print $2 " " $1}' 

試す:

awk -F'|' '{print $2" "$1}' foo 

これは出力します:

com.emailclient.account name1@gmail.com
com.socialsite.auth.accoun name2@msn.com

目的の出力を取得するには、さまざまなことを行うことができます。私はおそらくsplit()2番目のフィールドだと思います:

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file
emailclient name1@gmail.com
socialsite name2@msn.com

最後に、最初の文字を大文字に変換するのは、優れた組み込み関数awkがないため、少し面倒です。ucfirst()

awk -F'|' '{split($2,a,".");print toupper(substr(a[2],1,1)) substr(a[2],2),$1}' file
Emailclient name1@gmail.com
Socialsite name2@msn.com

より簡潔なものが必要な場合(サブプロセスを放棄しますが)、次のことができます。

awk -F'|' '{split($2,a,".");print a[2]" "$1}' file | sed 's/^./\U&/'
Emailclient name1@gmail.com
Socialsite name2@msn.com
于 2013-03-24T12:44:27.433 に答える
3

フィールドセパレータとしてドットまたはパイプを使用します。

awk -v FS='[.|]' '{
    printf "%s%s %s.%s\n", toupper(substr($4,1,1)), substr($4,2), $1, $2
}' << END
name1@gmail.com|com.emailclient.account
name2@msn.com|com.socialsite.auth.account
END

与える:

Emailclient name1@gmail.com
Socialsite name2@msn.com
于 2013-03-24T19:45:13.543 に答える
2

awkは大丈夫です。このファイルはWindowsシステムからのものであり、行末にCR(^ m ascii 0x0d)があると思います。

これにより、カーソルは$2の後の行の先頭に移動します。

:se ff=unixCRを取り除くには、dos2unixまたはviwithを使用します。

于 2013-03-24T11:20:35.113 に答える
2

ファイルにCRLFターミネータが含まれている可能性があります。すべての行の後に\r\nが続きます。

awk$2実際に認識し$2\rます。\r手段は行の先頭に移動します。

{print $2\r$1}最初に印刷$2し、次にヘッドに戻り、次に印刷します$1。したがって、フィールド2はフィールド1によってオーバーレイされます。

于 2017-06-27T16:51:46.013 に答える