スペースで区切られた次のファイルがあります。
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
として取得できます。awk
kmax
- プログラムは
$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