2017-10-09 5 views
0

filesize、filedate、filetime、およびfilepathレコードを含むテキストファイルがあります。ファイルパスは空白を含むことができ、非常に長くてもよい(クラシック音楽名)。私はファイルをfileate、filetime、filesize、およびfilepathで印刷したいと思います。この作品私はawkを使って並べ替えられたフィールドを印刷し、次に4番目のフィールドから最後まで印刷したい

awk '{print $2,$3,$1}' filelist.txt 

が、それは2行にレコードを出力します:ファイルパスなしの最初の部分は、簡単です

awk '{print $2,$3,$1,$1=$2=$3=""; print $0}' filelist.txt 

私は-d」 『-f』 2カットを使用して試してみました3 1 4- 'であるが、フィールドを並べ替えることはできない。私はsedを使って2行の問題を解決することができます。 awkだけを使う方法がなければならない。要約すると、第2、第3、第1、第4フィールドから最後まで印刷したいと思います。誰も助けることができますか?

+1

[編集]あなたの質問簡潔な、検証可能なサンプル入力とexpecteを含めますd出力。 –

+0

最後に '$ 4'を追加しようとするとどうなりますか? 'awk '{print $ 2、$ 3、$ 1、$ 4}' filelist.txt' – leekaiinthesky

+0

@leekaiinthesky OPが言っているように、ファイルパスにはスペースが含まれていて、' $ 4'に収まりません。代わりに、予期せぬ数のフィールド$ 4、$ 5、$ 6などに広がる可能性があります。 C:¥Program Files¥Common Files¥Microsoft Shared¥Team Foundation Server¥something'のファイルパスを考えてみましょう。これは6つのフィールドに分割されます! – CiaPan

答えて

0

awkprint statementは常に最後に改行を出力しますので、(技術的にORS、その改行デフォルト)、あなたの最初のprintは2行で出力を中断します。

printfでは、書式文字列を使用して出力を完全に制御します。(引数なしprintに相当する)だから、あなたは""にそれらを設定し、その後、(改行なし)printfとの最初の3つのフィールドを印刷することができ、そしてちょうどprint $0で終える:

awk '{ printf("%s %s %s",$2,$3,$1); $1=$2=$3=""; print }' file 
+0

唯一のパラメータであれば、 'print'には' $ 0'が必要ですか? AFAIR 'print'はデフォルトで$ 0を出力するので、' print'命令だけで十分です。 – CiaPan

+0

あなたは正しいです、私はそれを私の答えに加えました。ありがとう。 – randomir

0

可能な限り私はawkを避けます。

while read size date time path 
do echo "$date $time $size $path" 
done < filelist.txt 

あなたは可能性がprintfの代わりに、より多くの書式設定オプションについてecho - 私はあなたが言ったことを正しく理解していれば。 $ pathの埋め込みスペースは最後のフィールドなので問題ありません。

0

私はawkを手にしていますが、printfを使用して1行出力をフォーマットするとします。 $0に3番目のスペースを置き、その位置から入力行の最後まで部分文字列を取ります。

また、それはいつもそれに続く、<tab>のようなものを使ってフィールドを区切るのに役立ちます

0

...私はそれが望ましい結果を生むか分からないが、標準print前にフィールドを交換しようとするかもしれません操作は、最初の行はデータを生成し(私はあなたが-dなしcutを使用見ることができるので、多分あなたのデータが既にタブ区切りです。)

echo 1 2 3 very long name | 
    sed -e 's/ /\t/' -e 's/ /\t/' -e 's/ /\t/' | 
    awk -v FS='\t' -v OFS='\t' '{print $2, $3, $1, $4}' 

...簡単です。 sedコマンドは、各行の最初の3つのスペースを\tに置き換えます。その後、awkは完璧に動作し、タブ区切りのデータを再度出力します(これには新しいawkが必要です)。

0

GNU AWKでgensubのための():

どんなAWKで
$ echo '1 2 3 4 5 6' | awk '{print $3, $2, $1, gensub(/([^ ]+){3}/,"",1)}' 
3 2 1 4 5 6 

$ echo '1 2 3 4 5 6' | awk '{rest=$0; sub(/([^ ]+){3}/,"",rest); print $3, $2, $1, rest}' 
3 2 1 4 5 6 
関連する問題