2

一部の特定の列のみを変更して、入力列のASCIIデータファイルを印刷したい。awkを使用して列を変更すると(例:$ NF = 99)、最後に「print $ 0」コマンドを実行すると、出力は正しく出力されますが、他の列のスペースの埋め込み、書式設定などはすべて失われます。(それらはすべて基本的にOFSに置き換えられます)。

指定された列のみを変更して、awkにまったく同じ入力を出力させる方法はありますか?この出力を、非常に厳密な読み取り形式を持つ別のFortranコードに渡す必要があります。そのため、行の書式を変更する余裕はありません。

awkがこの目的で使用する必要のあるソフトウェアではない場合、何を提案しますか?


更新:例:

エントリを続けて入力します。

0 0 0 0 0 0 0  1936 24170  2536  1987 24094  2543  2037 24153  2550  2088 24202  2557 27 24 24.5 10000.0    0.31     0.0 10000.0     0.0     0.0     0.0    0.65

そのエントリをに変換したい

0 0 0 0 0 0 0  1936 24170  2536  1987 24094  2543  2037 24153  2550  2088 24202  2557 27 24 24.5 10000.0 10000.0 10000.0 10000.0 10000.0 10000.0 10000.0 10000.0

重要な部分は、他の列の間隔と位置をそのまま維持することです。


タスクを実行するためにできる最も近いことは、次のコマンドです。

gawk '{output=$0;for (i=0;i<8;i++){output=substr(output,0,97+8*i-1)"10000.0"substr(output, 97+8*(i+1)-1)}; print output}'
4

3 に答える 3

1

GNU awk を使用して、3 番目のフィールドを「replacement」という単語に置き換える方法は次のとおりです。

$ cat file
field1      field2           field3    field4

$ gawk -v field=3 -v text="replacement" '{ print gensub("(^[[:space:]]*([^[:space:]]+[[:space:]]+){" field-1 "})[^[:space:]]+", "\\1" text, "") }' file
field1      field2           replacement    field4

他の awks では、sub() または match()+substr() で同じことができます。

フィールドの終了位置を維持するには、置換テキストが元の長さに先行するスペースを加えた長さ以下であると仮定します。

$ cat file
field1      field2           field3    field4
  field1      field2           field3    field4

$ awk -v fieldNr=3 -v text="replacement" -f tst.awk file
field1      field2      replacement    field4
  field1      field2      replacement    field4

$ cat tst.awk
BEGIN {
    preFld="^([[:space:]]*[^[:space:]]+){" fieldNr-1 "}"
}
{
    match($0,preFld)
    head = substr($0,RSTART,RLENGTH)

    match($0,preFld "[[:space:]]*[^[:space:]]+")
    field = substr($0,RSTART+length(head),RLENGTH-length(head))

    printf("%s% *s%s\n", head, length(field), text, substr($0,RSTART+RLENGTH))
}

この件名と別の解決策の詳細については、GNU gawk の「patsplit()」関数および/または FIELDWIDTHS 変数を試してください。

于 2013-03-20T03:35:55.087 に答える
1

あなたは自分が何をしているのかについてあまり具体的ではないので、ここで具体的に言うことはできません. それは言った:

$0フィールドを選択するのではなく、コードを直接変更する必要があるように思えます。sub()またはgsub()あなたに役立つかもしれません。または、を使用してフィールドを「見つける」ことができますmatch()

于 2013-03-19T22:30:54.200 に答える