複数の英字ストリングを含むテキストファイル(file1
)があり、その前にバーコードとして機能する短い英数字ストリングが続きます。アルファベットの文字列はすべて同じ長さで、前の英数字は同じではありません。アルファベットと英数字の文字列は、各行の空白で区切られています。テキストファイルからbashツールを使用して列範囲を抽出する
$ cat file1
a1 abcdefghijklmnopqrstuvwxyz
b27 abcdefghijklmnopqrstuvwxyz
c4 abcdefghijklmnopqrstuvwxyz
は、列範囲の情報を含む第2のファイル(file2
)を仮定する。この範囲は常にアルファベット文字列よりも小さい。
$ cat file2
2-13
私はバーコードを維持しながら、file1
にアルファベットの文字列からfile2
で指定した列の範囲を抽出し、bashのコードを開発しようとしています。
$ sought_command file1 file2
a1 bcdefghijklm
b27 bcdefghijklm
c4 bcdefghijklm
私は、電動工具は、この点で参考になるこれはbash不確かですが、awk
はこれを行うことができますツールとなることを想定し。
注:私がしたこのタスクに関して、Pythonのコードが最も簡単かもしれないことを知っています。しかし、処理されるアルファベットの文字列が何万文字も長いため、Pythonの実装が不当に遅くなることが判明しました。したがって、私は故意にこの問題をbashツールで解決しようとしています。
うわー!私にとって、それは最高級のバッシュパワーです。あなたの答えをありがとう。 –
あなたは歓迎してありがとうございますが、その答えはbashとは関係ありません。 awkは、UNIXシェル(bash、ksh、csh、shなど)またはWindowsから呼び出すことのできる完全に別個のツールです。これは、すべてのUNIXインストールで標準として提供されます。 bashやその他のシェル構造を使用することは、あなたの問題には適切ではありません - [https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text- (https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice) –
私はそれを実現しましたあなたのコードは、 'file2'の2番目の数字が列の範囲の停止位置ではなく長さであるかのように動作します。問題を修正するために、コマンドを 'awk 'に変更しようとしました。NR == FNR {start = $ 1; lgth = $(expr $ 2- $ 1);}} {print $ 1、substr($ 2、start、lgth)} 'FS =' - 'file2 FS =' 'file1'。内部減算を参照してください。しかし、私の修正は機能していません。私のための提案がありますか? –