テキストファイルの最初の列を6から現在の値を減算した値に置き換えます。

テキストファイルの最初の列を6から現在の値を減算した値に置き換えます。

スペースで区切られた次のファイルがあります。

2.5   235215           3.1925
3.7   125255           1.3125

最初の列を6から現在の値を減算した値に変更する必要があります。必要な結果は次のとおりです。

3.5   235215           3.1925
2.3   125255           1.3125

Bashスクリプトを使用してこれをどのように実行できますか?

頑張った

$KMAX=6
sed -E "s/^(([^ ]+ +){3})$1  /\1$KMAX-$1 /" $1

答え1

これは次の方法で簡単に解決できますawk

awk -v kmax=6 '{$1=kmax-$1}1' file.txt 
  • これにより、値を内部で使用可能な変数6として取得できます。awkkmax
  • プログラムは$1最初の列を算術結果に置き換えますkmax-$1
  • 1アクションブロックの外側の一見で「失われた」結果は、すべての修正を含む現在の行を印刷することです。

注:スペースで区切られた列の場合awkのみ一つスペースは出力で区切り文字として機能するため、結果は次のようになります。

3.5 235215 3.1925
2.3 125255 1.3125

答え2

使用幸せ(以前のPerl_6)

~$ raku -ne 'given .split( / \s+ /) { put join "\t", (6 - .[0], .[1..*])  };'  

または:

~$ raku -ne 'given .split( / \s+ /) { join("\t", (6 - .[0], .[1..*])).put };'  

RakuはPerlプログラミング言語スイートです。 Rakuを使用すると、1行のコードを簡単に処理できるという利点があり、より深刻なCSV処理が必要な場合はモジュール(たとえばText::CSV)を使用できます。

上記のコードは、-ne非自動印刷、1行ずつフラグを使用して呼び出されます。このgivenキーワードは、Rakuにスペースを使用して入力を1つの項目(1行)として処理するように指示しますsplit。ブロック内の最初の要素から6を引いて、.[0]結果を残りの.[1..*]要素と一緒にリストに入れます。最後に出力を印刷しますput

入力例:

2.5   235215           3.1925
3.7   125255           1.3125

出力例:

3.5 235215  3.1925
2.3 125255  1.3125

https://raku.org

関連情報