ファイルリストの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%%.*}
.*
$pathname
basename
テスト:
$ 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)
システムのマニュアルを参照してください。
答え2
そしてzsh
:
print -rC1 -- input/*.mcool(N:t:r:r:r:r)
(:t
修飾子を使用すると、次のようになります。尾、:r
しかも根(cshやvimのようにファイル拡張子を削除してください)
または:
set -o histsubstpattern
print -rC1 -- input/*.mcool(N:t:s/.*//)
または:
(){print -rC1 -- ${@/.*}} input/*.mcool(N:t)
(${var/pattern[/replacement]}
csh-styleの代わりにksh-styleを使用してください:s/foo/bar/
。匿名関数に渡された引数については、ここでkshを参照してください${@%%.*}
。)
答え3
すべての入力が次の場合
./../input/A001C007.hg38.nodups.pairs.mcool
もしそうなら、最も簡単な方法はおそらく次のとおりです。
start cmd:> sed -e 's+^./../input/++' -e 's/\..*$//' input
A001C007
A001C008
/
.
3回目から次回まですべて削除したい場合
start cmd:> sed -r -e 's+^([^/]*/){3}++' -e 's/\..*$//' input
A001C007
A001C008
説明されている一般的な解決策は、.
数量を3回目まで計算する必要があります/
。
答え4
/
3番目と4番目のものがわかっている場合と区切り文字に基づいてフィールドを定義することも.
できます。awk
/
.
awk -F'[./]' '{print $7}'