2017-05-12 15 views
1

複数の英字ストリングを含むテキストファイル(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ツールで解決しようとしています。

答えて

3
$ awk 'NR==FNR{start=$1;lgth=$2;next} {print $1, substr($2,start,lgth)}' FS='-' file2 FS=' ' file1 
a1 bcdefghijklmn 
b27 bcdefghijklmn 
c4 bcdefghijklmn 

または第二フィールドであれば端位置ではなく、長さ:

$ awk 'NR==FNR{start=$1;lgth=$2-$1+1;next} {print $1, substr($2,start,lgth)}' FS='-' file2 FS=' ' file1 
a1 bcdefghijklm 
b27 bcdefghijklm 
c4 bcdefghijklm 
+0

うわー!私にとって、それは最高級のバッシュパワーです。あなたの答えをありがとう。 –

+1

あなたは歓迎してありがとうございますが、その答えは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) –

+0

私はそれを実現しましたあなたのコードは、 'file2'の2番目の数字が列の範囲の停止位置ではなく長さであるかのように動作します。問題を修正するために、コマンドを 'awk 'に変更しようとしました。NR == FNR {start = $ 1; lgth = $(expr $ 2- $ 1);}} {print $ 1、substr($ 2、start、lgth)} 'FS =' - 'file2 FS =' 'file1'。内部減算を参照してください。しかし、私の修正は機能していません。私のための提案がありますか? –

関連する問題