最新記事

シェルスクリプトの現在のシェルでプログラムを実行します。
shell
ssh
awk
scripting
zsh

シェルスクリプトの現在のシェルでプログラムを実行します。

.ssh設定を解析し、fzfを使用してエントリを選択し、そのホストに接続できる小さなシェルスクリプトを作成しました。 #!/bin/bash set -o nounset -o errexit -o pipefail list_remote_hosts() { choice="$(cat $HOME/.ssh/config | awk -v RS= -v FS=\\n -v IGNORECASE=1 ' { ip = "" alias = "" id_file = "" username = "" port = "" for (j = 1; j <= NF; ++j) { split($j, tmp, " ") if (tmp[1] == "Host") { alias = tmp[2] } if (tmp[1] == "Hostname") { ip = tmp[2] } if (tmp[1] == "IdentityFile") { id_file = tmp[2] } if (tmp[1] == "User") { username = tmp[2] } if (tmp[1] == "Port") { port = tmp[2] } } if (ip || alias && alias != "*") { if (port == "") { port = "22" } print "ssh " username "@" ip " -i " id_file " -p " port } } ' | fzf)" "$($choice)" } list_remote_hosts これはうまくいきますが、現在シェルの所有権を付与するのに問題があります。接続後、スクリプトはフリーズします(sshがサブシェルで起動されたようです)。たとえば、終了を入力し、ssh コマンドが終了すると出力を表示できます。 端末でsshコマンドを実行するのと同じ動作を得るためにスクリプトを実行すると、現在のシェルに自動的に所有権を付与したいと思います。 && zsh追加や使用evalなど、さまざまな方法を試しましたが、execどちらも機能しませんでした。どうすればいいですか?

Admin

合計が0の場合、他の既知の値をファイルに印刷するにはどうすればよいですか?
awk
replace
math

合計が0の場合、他の既知の値をファイルに印刷するにはどうすればよいですか?

データ平均を計算するために、レコードの総数と欠落ファイルの総数を抽出するファイルがたくさんあります。不足しているレコードの数がレコードの総数と同じファイルがたくさんあります。 これにより、0という値が生成され、ファイルデータの合計は0にSettotal.tmpなり、次のエラーメッセージが表示されますawk: cmd. line:1: (FILENAME=Settotal.tmp FNR=1) fatal: division by zero attempted。 残念ながら、これは私のスクリプトを中断します。この問題を解決するためにいくつかの方法を試しました。私はifステートメントを使って問題を解決できると思いましたが、うまくいきませんでした。 この場合、合計はゼロなので、強制的にレコード全体の合計である91に等しくなるように値を設定しようとしています。この場合、ゼロエラーをバイパスし、出力Divsortotal.tmpファイルを次のように作成できます。 {有効データと欠落データの合計(-999)(修正値):91} 入力ファイル(Validpoints.tmp): Sum Total Records: 91 Number of missing data: -91 awk -F ':' '{ sum+=$2 }; END { print "sum of valid and missing(-999) data (corrected value):" sum (if $2=0 {print NF==1 $2})}' Validpoints.tmp > Divsortotal.tmp どんな助けでも大変感謝します。ありがとう

Admin

スクリプト内でawkの動作が変わります。
shell-script
awk
inotify

スクリプト内でawkの動作が変わります。

RCTI-形式の注文番号フィールドと、注文番号を構成する英数字を含む「ベンダー請求書番号」で始まる行を含むテキストファイル「invoice.txt」があります。 次のコマンドを入力すると: awk '/Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit}' /mnt/path/invoice.txt コマンドラインまたはbashのスクリプトで実行すると、REA-0130193/2などの請求書番号が返されます(RCTI-次の部分のみが必要です。この場合は正しいです)。各実行時に請求書ファイルの総数を処理するのではなく、新しいファイルのディレクトリに到着する新しいinotifywaitテキストファイルでのみ作業することを含む新しいスクリプトに統合しました。 inotifywait -m /mnt/path -e create -e moved_to | while read path action file; do i="$path$file" echo "$i" orderno="$(awk '/Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit}' $i)" echo "$orderno">>test.txt done この方法も機能します。テキストファイルが到着すると、「test.txt」に新しい注文番号が生成されます。ただし、次のように呼び出してこのコマンドを含むスクリプトを実行した場合: ~/script.sh& or ~/script.sh & 他のスクリプトから、この場合私は対価として何も得られず、それは私を狂わせます。スクリプト内のスクリプトの場合は動作が停止しますが、端末またはバックグラウンドで直接実行すると正しく動作する理由を知っている人はいますか? 私をさらに混乱させることは、次のいずれかの形式を含む他のawkコマンドが同じscript.shで動作し続けることです。 paidamount="$(awk '/Payment Amt/ {gsub(",","",$11) ; print $11;exit}' $i)" echo "$paidamount">>test.txt 特殊文字に関する懸念のため、次の内容で別々のorderno.awkファイルを作成しました。 #! /usr/bin/awk -f /Vendor Invoice No/ {gsub("RCTI-","",$4) ; print $4 ; exit} そして電話してください orderno="$(~/orderno.awk $i)" 同じスクリプト内では動作は変わりません。 コマンドを次のように作成します。 orderno="$(awk '/Vendor Invoice No/ {gsub(/RCTI-/,"",$4) ; print $4 ; exit}' $i)" 私は違いを見ることができません。

Admin

sedとwcをawkに置き換える方法は? (ディレクトリの名前の計算)
awk
sed
wc

sedとwcをawkに置き換える方法は? (ディレクトリの名前の計算)

フォルダ内の要素数を計算したいです。私はそれについて考えた function lsc { /bin/ls -l $1 | sed 1d | wc -l } しかし、私は人々がこれらのパイプを減らし、余分なものをawk取り除いている方法を思い出しました。それで、あなたは何をしますか?grepsedawk

Admin

フォルダ内のファイルを繰り返し、列の先頭/末尾のスペースを削除します。
text-processing
awk
sed

フォルダ内のファイルを繰り返し、列の先頭/末尾のスペースを削除します。

この形式の複数のファイルを含むフォルダがあります> 1 Hello1 World1 Example1 2 Hello2 World2 Example2 ... 区切り記号は次のとおりです。\t 各列の先頭/末尾のスペースがある場合は、それらをすべて削除したいと思います。 はい 1 Hello1\s World1 \sExample1 ( \s) < はスペースを表し、予想される出力は次のようになります。 1 Hello1 World1 Example1 値にスペースを含めることができるため、スペースを完全に削除したくありません(例:)Hel lo。 また、新しいファイルを作成するのではなく、現在のファイルを編集したいと思います。

Admin

Mac端末のファイルセットでコードを実行する
awk
sed
grep

Mac端末のファイルセットでコードを実行する

.txtファイルを変更するスクリプトがあります。 これは私のスクリプトです。 awk 'BEGIN{FS=OFS="\t"}{split($1,a,"_"); split(a[3],b,"/"); print a[1],a[2],b[1],b[2],$0}' file.txt | awk 'BEGIN{FS=OFS="\t"}{split($18,a,";"); split(a[2],b,"="); print b[2],$0}' > out_file.txt 私のフォルダにファイルがたくさんあります。 私のファイルからこのスクリプトを実行し、元のファイル名で各出力を返したいと思います。 私はこれを試しました > for i in `find . -maxdepth 1 -type f -iname "*.txt" awk 'BEGIN{FS=OFS="\t"}{split($1,a,"_"); split(a[3],b,"/"); print a[1],a[2],b[1],b[2],$0}'| awk 'BEGIN{FS=OFS="\t"}{split($18,a,";"); split(a[2],b,"="); print b[2],$0}'print > out}' *.txt -bash: syntax error near unexpected token `|' (base) user112$ しかし、何も起こりませんでした。

Admin

リンク形式を変更する sed または awk スクリプト
awk
sed

リンク形式を変更する sed または awk スクリプト

Web文書では、人々がhrefリンクから「を省略すると、エラーが頻繁に発生します。 例えば この問題を解決するために、マークダウンファイルで実行できるスクリプトを作成しました。 sed -i -e 's/ target=\"_blank\"/\"&/' docs.md これは上記の内容を操作し修正します。 ただし、aが見つからないことを確認しないため、"リンクが正しく作成されたら別のリンクを追加します。 また、hrefリンクの後には常に次のものが続くと仮定します。target="_blank" したがって、他の方法でアクセスして、a href=次のブロックが常に含まれていることを確認する方が" "良いかもしれません。 " "より多くの処理が必要な状況の例に href 以降の内容が含まれていることを確認して処理する場合、次の場合に処理が必要です。

Admin

日付フィールドに基づいてCSVファイルを分割する
awk

日付フィールドに基づいてCSVファイルを分割する

年に基づいてファイルを分割する方法私のファイルには2019年と2020年のデータがあり、以下にいくつかの行が記載されています。 hash,block_timestamp,addresses 1b8fb81b9c4db4cf3659d2553e7c1d5a4dac21400e331ea3deecdfa45e2eb7d7,2020-05-08 13:43:38 UTC,32UNEwo4UtXrD8xjAVDGapBcWQ9B7HBQNb daeac50f989f0d31bcc412ca47e2e082f7d0599d8e577a9a310f7ab4e9d474d2,2020-05-08 13:21:33 UTC,3BMEXPLQqB9rkR5SMhJdA4Xm98ntT5xuw8 56777decb012d60f36f9cd4b9acfe13215f670bbe192f261db21e64f98e212be,2019-05-08 13:39:39 UTC,1AMtkH4riMpxSe7YMbs6h2aaDXVdxnmMFy f5a1d52f013f1ee49a6cad971a5782c1c9905030d35ac28e23a2113fd1941421,2019-04-10 18:36:01 UTC,1LBBNap7kLswvgYbzmfLeskAfEMToiinkB 頑張った awk -F',' '{print >((substr($2,1,4)<=2020)?"2019":"2020")}' combined-out.csv 結果は2つの空のファイルです。この問題を解決する方法

Admin

awk:コマンドで定義された変数から名前が由来するファイルとして印刷
text-processing
awk

awk:コマンドで定義された変数から名前が由来するファイルとして印刷

私は学んでいますawk。私の問題の解決策を見つけようとして、私は次のコードを見つけましたが、最後に停止しました1.説明: 内容file: H|20200425|abcd| # header R|abc|2019-03-06|100.00 R|abc|2019-03-06|15.00 R|abc|2019-03-06|10.00 最後に追加 T|20200425|-count of records-|-sum of 4th column- 20190306.txt出力をYYYYMMDD形式の3列目の日付であるファイルに送信します。 私の試み: awk -F'|' ' # get the date formatted NR == 2 { d = $3; gsub(/-/,"",d) } # get the 2nd field of the header NR == 1 { a = $2 } # if the line starts with 'R', sum the column and get the count of them $1 == "R" { sum += $4 ++c } # print the final line with variables acquired END { OFS = "|"; print "T",a,c,sum".00" }1 ' file このコマンドは「予想」結果を提供します。 H|20200425|abcd| R|abc|2019-03-06|100.00 R|abc|2019-03-06|15.00 R|abc|2019-03-06|10.00 T|20200425|3|125.00 変数dはです20190306。 しかし、私が尋ねている質問は、この出力をファイルにリダイレクトする方法です20190306.txt。 「もちろん、これは誤ったコーディングです。ため息をつく、Brainache)、しかし私の目標は可能な限り問題に集中することであり、すべてのバグを指摘するように要求するわけではありません。

Admin

特定のパターンが一致するまで、1行を複数行に分割します。
awk

特定のパターンが一致するまで、1行を複数行に分割します。

各データ行を複数の行に分割し、期待される結果セットに示すように新しいファイルc1.txtにコピーしようとしています。ただし、c2.txt最終的に2つのファイルの間に違いはなく、両方のファイルはまだ同じ行数を持ちます。c1.txtc2.txttwo c1.txt # file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::--- # file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- パスワード awk -v dt="file :" '$0 ~ dt {gsub(dt, "\n"dt)}1' c1.txt > c2.txt 予想される結果 # file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::--- # file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::---

Admin

「0」と最初の2つのフィールドを除くcsvファイルのすべてのテキストを1に変換するには?
text-processing
awk
command-line
bioinformatics

「0」と最初の2つのフィールドを除くcsvファイルのすべてのテキストを1に変換するには?

いくつかの大きな .csv ファイルがあり、このファイルをバイナリ (1 と 0) 形式に変換したいと思います。最初の2つのフィールドを除いて、テキストを含むすべてのセルは1になり、0は0のままです。 head Test.csv Iss1,1,0,0,Hsapiens-I34,0,0,0,Mmusculus-H01,0,0 Iss1,11,0,Scerevisiae-U09,Hsapiens-I05,0,0,0,0,0,0 Iss1,21,0,0,Hsapiens-I05,0,0,0,Hsapiens-I31,0,0 Iss1,31,0,0,Mmusculus-H13,0,0,0,0,0,Hsapiens-I31 Iss1,41,0,Scerevisiae-U09,0,0,0,0,0,0,Hsapiens-I21 Iss1,51,0,0,0,0,0,0,Scerevisiae-U25,0,Hsapiens-I21 Iss1,61,0,0,Hsapiens-I34,0,0,0,Mmusculus-H13,0,0 予想される結果は head Test.csv Iss1,1,0,0,1,0,0,0,1,0,0 Iss1,11,0,1,1,0,0,0,0,0,0 Iss1,21,0,0,1,0,0,0,1,0,0 Iss1,31,0,0,1,0,0,0,0,0,1 Iss1,41,0,1,0,0,0,0,0,0,1 Iss1,51,0,0,0,0,0,0,1,0,1 Iss1,61,0,0,1,0,0,0,1,0,0 ここで、ファイル内のすべてのテキストは1に変換されます。 誰もがこの問題を克服する方法についてアドバイスをすることができれば非常に感謝します。 ありがとう

Admin