8

AWK コマンドについて簡単な質問があります。同じ行の行末まで印刷するコマンドが必要ですが、次の行に到達したら別の行に印刷する必要があります。次の例は、より明確になります。

ファイルがあるとします:

0 1 2 3 This is line one
0 1 2 3 This is line two 
0 1 2 3 This is line three 
0 1 2 3 This is line four

私は次のことを試し、次の結果を得ました

awk '{for(i=5;i<=NF;i++) print $i}' fileName >> resultsExample1

resultsExample1 で次の結果が得られます

This
is
line
one
This 
is 
line 
two 
And so on....

例 2:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample2

resultsExample2 の場合:

This is line one This is line two this is line three This is line four

私も試しました:

awk 'BEGIN {" "} {for(i=5;i<=NF;i++) printf $1}' fileName >> resultsExample3

しかし、結果は前回と同じでした

最後に、私は次のことを望みます:

This is line one
This is line two 
This is line three
This is line four

どんな助けにも感謝します!前もって感謝します :)

4

5 に答える 5

18

この質問は非常に古いことは知っていますが、別の awk の例:

awk '{print substr($0,index($0,$5))}' fileName

動作: 印刷を開始したいインデックス ($0 の $5 のインデックス) を見つけ、そのインデックスから始まる $0 の部分文字列を印刷します。

于 2015-06-28T13:11:31.127 に答える
11

使用する方が簡単かもしれませんcut:

$ cut -d' ' -f5- file
This is line one
This is line two 
This is line three 
This is line four

これは、スペースで区切られたフィールドでは、5 番目から行末までを印刷することを意味します。

フィールド間に複数のスペースがある場合は、最初にtr -s' '.

于 2013-06-13T15:53:54.117 に答える
9

または awk を使用

awk '{$1=$2=$3=$4=""; sub(/^  */,"", $0); print }'  awkTest2.txt
This is line one
This is line two
This is line three
This is line four

また、解決策はほとんどありません。処理された各行の最後に「\ n」を強制的に出力するだけです。

awk '{for(i=5;i<=NF;i++) {printf $i " "} ; printf "\n"}' awkTest2.txt
This is line one
This is line two
This is line three
This is line four

BEGIN { " " }あなたはノーオペレーションであることに注意してください。また、現在の反復値を出力する$i代わりに使用する必要があります。$1

IHTH。

編集; sudo_O の異議に注意して、データに %s を追加しました。ここに出力があります

This is line one
This is line two
This is line three
T%shis is line four

これは問題になる可能性があるため、その場合はフォーマット文字列をprintfに渡す方法を読んでください。

于 2013-06-13T16:00:19.857 に答える
0

awk '{gsub (/[[:digit:]]/,"");{$1=$1}}1' file

于 2015-07-08T22:51:51.693 に答える