nとmの区切り記号の間の部分文字列の抽出

nとmの区切り記号の間の部分文字列の抽出

ファイルリストの3番目と4番目の間/のすべての項目を取得するためにforループを作成したいと思います。.

私の試み:

for mcool_file in ./input/*.mcool; do
    while IFS= read -r id; do
        id | cut -d \\ -f 4- -d_ -f1-4
        # Do something
    done;
done

逆追跡:

cut: only one type of list may be specified

入力する

./../input/A001C007.hg38.nodups.pairs.mcool
./../input/A001C008.hg38.nodups.pairs.mcool

希望の出力

A001C007
A001C008

ベストアンサー1

for pathname in input/*.mcool; do
    basename "${pathname%%.*}"
done

の各パス名に対して、パスinput名は標準引数の置換(値からパターンと一致する最長のサフィックス文字列を削除)を使用して最初のポイントから切り捨て、パスを抽出するために使用されます。名前の名前部分。.mcool$pathname${pathname%%.*}.*$pathnamebasename

テスト:

$ tree
.
`-- input
    |-- A001C001.something.mcool
    |-- A001C002.something.mcool
    |-- A001C003.something.mcool
    |-- A001C004.something.mcool
    |-- A001C005.something.mcool
    |-- A001C006.something.mcool
    |-- A001C007.something.mcool
    |-- A001C008.something.mcool
    `-- A001C009.something.mcool

2 directories, 9 files
$ for pathname in input/*.mcool; do basename "${pathname%%.*}"; done
A001C001
A001C002
A001C003
A001C004
A001C005
A001C006
A001C007
A001C008
A001C009

これは、最初の点が$pathnameパス名のディレクトリ部分ではなくファイル名に現れると仮定するためです./

basenameただし、これを最初に呼び出すと、ディレクトリパスにドットが含まれるように逆にすることができます。

for pathname in ./input/*.mcool; do
    name=$(basename "$pathname")
    printf '%s\n' "${name%%.*}"
done

もし私たちが知る削除するサフィックス文字列は正確に文字列.something.mcool(または.hg38.nodups.pairs.mcoolあなたの場合)であり、最良の解決策は次のとおりです。

for pathname in ./input/*.something.mcool; do
    basename "$pathname" .something.mcool
done

basename...パス名から既知のサフィックスを削除し、パス名のファイル名部分を一度に1つずつ返すために使用されます。

basename複数のファイルを処理し、各ファイルから固定サフィックス文字列を削除するための非標準およびオプションをサポートする実装-aでは、-s処理するファイルが多すぎない場合はループをまったく使用できません。

$ basename -a -s .something.mcool ./input/*.something.mcool
A001C001
A001C002
A001C003
A001C004
A001C005
A001C006
A001C007
A001C008
A001C009

basename(1)システムのマニュアルを参照してください。

おすすめ記事