私のフォルダにファイルがあります。のように見える
1232_2019_02_09_12_29_29.txt
1232_2019_02_09_12_29_55.txt
2019_02_09_12_29_29
ファイル名から&を抽出して&に変換したいです。2019_02_09_12_29_55
2019-02-09-122929
2019-02-09-122955
#!/bin/sh
path=$1
if [[ -z $1 ]];then
echo "USAGE:: Argument missing, supply full path to list all files"
exit 1
fi
if [ -f $path/all_files.txt ] ; then
rm -f $path/all_files.txt
fi
ls -l $path | grep -v "^d" | awk '{print $9}' > $path/all_files.txt
while read -r line
do
line=${line##*/}
# echo "${line%"/}"
ex1=`awk -F'|' '{print substr($1,length($1)-22, 19)}'`
# ex2=`awk -F'|' '{print substr($1,length($1)-19, 10)}'`
echo $ex1
ex2=$(echo $ex1 | cut -c 1-10)
echo $ex2
ex3=$(echo $ex1 | cut -c 12-20)
echo $ex3
done <$path/all_files.txt
ただし、このコードは目的の結果を提供しません。
答え1
while
ループ全体を次の行に置き換えることができます。
awk -F'[._]' '{print $2"-"$3"-"$4"-"$5$6$7}' $path/all_files.txt
ファイル拡張子()を保持するには、.txt
次のコマンドを使用する必要があります。
awk -F_ '{print $2"-"$3"-"$4"-"$5$6$7}' $path/all_files.txt
答え2
なぜ反対投票をしたのか理解できません。
あなたは新しい貢献者です。
あなたは研究/努力を注いだ。
だから私の英語が苦手でも千万幸いで申し訳ありません。
まず #!/bin/sh を作成してから if [[ -z $1 ]]
すべての sh シェルが [[ を処理するわけではないので、 if [ -z "$1" ] を使用して
常に "$1"
var don'
*. txtファイルを検索するスクリプトでlsを使用しないでください。したがって、ファイル名を all_files.txt として指定するのではなく、代わりに名前を指定してください。 .log
grep cutを使用しないでください... awkまたはsedを使用している場合はawkとsedが可能なので、処理はそれ以上です。
awkを使用すると、ファイルを1行ずつ読み込むのではなく、そうします。
次のことを試すことができます。
#!/bin/sh
if [ -z $1 ];then
echo "USAGE:: Argument missing, supply full path to list all files"
exit 1
fi
log="$1/all_files.log"
if [ -f "$log" ] ; then
rm -f "$log"
else
echo "no file to rm"
fi
echo "with gnu sed"
find "$1" -maxdepth 1 -type f -name '*.txt' |
sed 's/[^_]*_//;s/_//4g;s/_/-/g' # > "$log"
echo "with awk"
find "$1" -maxdepth 1 -type f -name '*.txt' |
awk -F\_ '{for(i=2;i<5;i++)a=a$i"-";a=a$(i++)$(i++)$i;print a;a=""}' # > "$log"
答え3
私は同じ結果を得るために次の方法を使用しました。
awk -F "_" 'OFS="-"{$1="";print $0}' filename|sed "s/\..*//g"| sed 's/^-//g'| awk '{print substr($1,1,13)substr($1,15,2)substr($1,18)}'
出力
2019-02-09-122929
2019-02-09-122955
答え4
使用sed
:
sed 's/^[^_]*_\(.*\)\..*$/\1/;y/_/-/;s/-\([^-]*\)-\([^-]*\)$/\1\2/' \
$path/all_files.txt