1

私は次のようなファイルを持っています:

something1

something2 201101130000

thing

thing1

thing2

AAA, -2, 4, 0, 54;

thing3

thing4

AAA, 43, 43, 0, 5, 0, 0,;

thing5

AAA, 132.0, 43.0,  0.0,  0.0, 43.0,210.0,'

thing5

2行目から日付(201101130000)をコピーし、コンマ(、)を追加して、最後の行の番号(132,0、43.0、0.0、43.0、210.0)をnewfile.txtに入力すると、新しいファイルが表示されます。 like :(元のファイルには、ここにあるように行間にスペースがありません)

20110113, 132.0, 43.0,  0.0,  0.0, 43.0,210.0

grepを試してみましたが、運が悪かったのです。ご協力いただきありがとうございます

4

2 に答える 2

1

これが私があなたの質問をどのように解釈したかです:

  • 'grep'して、2行の一部を結合しようとしています。これらの2行は、常に最後から2番目と2番目の行です。

  • また、出力を別のファイルにリダイレクトしようとしています。これには、次のようにシェルリダイレクトを使用できますawk ... file > outputfile



使用する1つの方法は次のsedとおりです。

sed '2h; $!N; $!D; ${ G; s/[^,]*\([^\n]*\).* \([0-9]\{8\}\).*/\2\1/; s/..$// }' file

これをLinuxとしてタグ付けしているので、GNU sedゴルフを持っていて気にしないと思います。

sed -r '2h;$!N;$!D;${G;s/[^,]*([^\n]*).*\s([0-9]{8}).*/\2\1/;s/..$//}' file

結果:

20110113, 132.0, 43.0,  0.0,  0.0, 43.0,210.0

説明:

2h         # copy the second line to hold space
$!N        # if not the last line append the next line
$!D        # if not the last line delete up to the first newline in the pattern
$ { ... }  # one the last line, perform two substitutions   


または、awk理解しやすい場合があります。

awk 'FNR==NR { c++; next } FNR==2 { x = substr($NF,0,8) } FNR==c-1 { sub(/[^,]*/,x); sub(/..$/,""); print }' file file

結果:

20110113, 132.0, 43.0,  0.0,  0.0, 43.0,210.0

説明:

FNR==NR { c++; next }    # read the first file in the arguments list, to get a 
                         # count of the number of lines in the file
FNR==2 { ... }           # when reading the second line of the second file in the
                         # arguments list, take a substring of the last field
FNR==c-1 { ... }         # one the second last line of the second file in the
                         # arguments list, perform two substitutions and print
                         # the line.
于 2013-02-06T19:14:40.057 に答える
0

AWK do the trick:

awk '/something[0-9][ ]*[0-9]+/{d = $2;} /AAA/{v = $0;} END{gsub("AAA",d,v); print v;}' file.txt

The output is:

201101130000, 132.0, 43.0, 0.0, 0.0, 43.0,210.0
于 2013-02-06T18:51:25.633 に答える