質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

解決済

4回答

1781閲覧

シェルスクリプトにてawkで正規表現を使用してファイルを複数取得する方法が知りたい

000mm

総合スコア6

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2021/07/01 09:43

前提・実現したいこと

A01結果.tsv
A02結果.tsv
B03結果.tsv
F04結果.tsv
A01_test結果.tsv

上記のようなファイルがディレクトリにあり、
A00のような、アルファベット1文字+数字2文字+'結果'に該当するtsvファイルのみを結合させたいのですが、
(例だと、一番下のA01_test.tsvは結合したくないファイルで、それ以外を結合したいです。)

どのファイルもヘッダーが同じなので、以下のようなコードで1番上のヘッダーだけ残して複数のファイルを結合しているのですが、

bash

1awk 'NR==1 || FNR!=1' *.tsv > merge.tsv

とすると、*.tsvとワイルドカードを使っているので、当然のごとく全てのtsvファイルが結合されてしまいます。

bash

1awk 'NR==1 || FNR!=1' ^[A-Z][0-9]{2}結果.tsv > merge.tsv

とすると、A-Zで始まり、数値2桁が次に入り、結果.tsvで終わるファイルのみ結合されるかなーと考えたのですが、次項のエラーが排出されました。

発生している問題・エラーメッセージ

awk: can't open file ^[A-Z][0-9]{2}結果.tsv source line number 1 [Done] exited with code=2 in 0.032 seconds

該当のソースコード

bash

1awk 'NR==1 || FNR!=1' ^[A-Z][0-9]{2}結果.tsv > merge.tsv

試したこと

シングルクォーテーションの位置などを変えてみたりなどしましたが、
うまくいきませんでした…。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/07/01 10:23

結合する順番はどうでもいいのですか?
000mm

2021/07/01 10:48

順番はどうでも大丈夫です! できればファイル名のソート順だと嬉しい、ぐらいの感覚です!
guest

回答4

0

あんまりファイル数が多いと対応できなくなりそうですが…

bash

1f=`ls -1 [A-Z][0-9][0-9]結果.tsv` 2x=`echo $f | cut -f 1` 3head -n 1 $x >merge.tsv 4echo $f | while read x 5do 6 sed -e '1d' $x >>merge.tsv 7done

投稿2021/07/01 13:49

takasima20

総合スコア7464

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

その場所では正規表現は使えません。数字2文字なら2回書きます。

sh

1awk 'NR==1 || FNR!=1' [A-Z][0-9][0-9]結果.tsv > merge.tsv

正規表現を使うなら、awkの中でしょうか。

sh

1awk 'FILENAME ~ /^[A-Z][0-9]{2}結果.tsv$/ && (X==0||FNR!=1}{X=1;print}' * > merge.tsv

投稿2021/07/01 11:54

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

パラメータとして与えているファイル名はawkではなくシェルによって処理される部分なので、正規表現は使えません。

最初のファイルの1行目とすべてのファイルの1行目以外を出力するとすると、コマンド置換を利用して、こんな感じでどうでしょう。

awk 'NR==1{print; next} FNR!=1' `ls *.tsv|egrep '[A-Z][0-9][0-9]結果.tsv'` > merge.tsv

あるいはxargsなどを使う手もありそうです。

投稿2021/07/01 11:22

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考にどうぞ

Bash

1#!/bin/bash 2arg="" 3for file in *.tsv; do 4 if [[ ${file} =~ ^[A-Z][0-9]{2}結果.tsv$ ]]; then 5 arg+=" $file" 6 fi 7done 8echo $arg

投稿2021/07/01 10:38

itagagaki

総合スコア8402

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問