como cortar campos de um nome de diretório?

2

Eu tenho o diretório chamado 140905_M01771_0112_000000000-ABBYT . Quero obter o terceiro campo, por exemplo, 0112 . Eu tentei:

cut -d _ -f 3 131230_M01771_0032_000000000-A7874 

dando erro:

cut: 131230_M01771_0032_000000000-A7874/: Is a directory
    
por user160320 09.03.2016 / 16:13

5 respostas

4

Quando você passa um argumento na linha de comando de cut , além de opções, é um nome de arquivo para ler dados. Você está pedindo para o cut processar dados do arquivo 131230_M01771_0032_000000000-A7874 , o que causa um erro porque é um diretório, não um arquivo contendo dados.

Em vez de chamar um utilitário externo, você pode usar o conjunto interno do shell Construções de expansão de parâmetro .

dir="131230_M01771_0032_000000000-A7874"
third_field="${dir#*_}"; third_field="${third_field#*_}"; third_field="${third_field%%_*}"
echo "$third_field"
    
por 10.03.2016 / 02:52
3

Como você sabe o nome para operar, por que não levá-lo para uma variável e passar a variável para STDIN de cut , o que você pode fazer desta forma no bash, ksh ou zsh:

% dir='140905_M01771_0112_000000000-ABBYT'          

% cut -d_ -f3 <<<"$dir"                   
0112

Ou se você souber que os nomes de diretório terão pelo menos três _ se um - , então uma simples construção for sobre os nomes será:

for dir in *_*_*_*-*; do cut -d_ -f3 <<<"$dir"; done
    
por 09.03.2016 / 16:21
1

Os parâmetros para cut são os nomes dos arquivos que contêm as informações a serem cortadas, não as informações reais.

Se você não passar nenhum parâmetro além das definições de corte, ele procurará as informações para cortar sua entrada padrão.

Portanto, faz mais sentido canalizar as informações para o comando cut. Por exemplo:

ls -1d -- *_*_*_* | cut -d _ -f 3

O comando ls fornecido listará todos os arquivos (incluindo diretórios) com o padrão de nome especificado, e a lista de arquivos resultantes dele será cortada pelo comando cut .

    
por 09.03.2016 / 16:21
1

com zsh :

dir=140905_M01771_0112_000000000-ABBYT
third_field=${${(s:_:)dir}[3]}

Ou:

fields=(${(s:_:)dir})
third_field=$fields[3]

POSIXly:

IFS=_; set -o noglob
set -- $dir
third_field=$3
    
por 11.03.2016 / 16:04
0
echo 140905_M01771_0112_000000000-ABBYT | cut -c 15,16,17,18
    
por 11.03.2016 / 17:14