簡體   English   中英

在目錄中使用awk拆分文件夾名稱

[英]splitting folder names with awk in a directory

使用此模板的工作目錄中有一些目錄

cas-2-32
sat-4-64  
...

我想遍歷目錄名稱並獲取文件夾名稱的第二部分和第三部分。 我已經寫了這個腳本。 身體顯示出我想做的事。 但是awk命令似乎是錯誤的

#!/bin/bash
for file in `ls`; do
  if [  -d $file ]; then 
    arg2=`awk -F "-" '{print $2}' $file`
    echo $arg2
    arg3=`awk -F "-" '{print $3}' $file`
    echo $arg3
  fi
done

但它說

 awk: cmd. line:1: fatal: cannot open file `cas-2-32' for reading (Invalid argument)

awk需要一個文件名作為輸入。 由於您說過cas-2-32等是目錄,因此awk失敗的原因也相同。

使用echo將目錄名稱輸入awk:

#!/bin/bash
for file in `ls`; do
  if [  -d $file ]; then 
    arg2=$(echo $file | awk -F "-" '{print $2}')
    echo $arg2
    arg3=$(echo $file | awk -F "-" '{print $3}')
    echo $arg3
  fi
done

簡單命令:ls | awk'{FS =“-”; print $ 2“” $ 3}'如果希望每行中的值只是在awk的打印結果中添加“ \\ n”而不是空格。

當這樣執行時

awk -F "-" '{print $2}' $file

awk$file的值視為要解析的文件,而不是解析$file的值本身。

最小的解決方法是使用here-string ,該字符串可以將變量的值輸入命令的stdin:

awk -F "-" '{print $2}' <<< $file

順便說一句,如果只需要當前目錄中的文件列表,則不需要ls ,而是使用*代替,即

for file in *; do

單程:

#!/bin/bash
for file in *; do
  if [ -d $file ]; then
    tmp="${file#*-}"
    arg2="${tmp%-*}"
    arg3="${tmp#*-}"
    echo "$arg2"
    echo "$arg3"
  fi
done

另一個:

#!/bin/bash
IFS="-"
for file in *; do
  if [ -d $file ]; then
    set -- $file
    arg2="$2"
    arg3="$3"
    echo "$arg2"
    echo "$arg3"
  fi
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM