bash 脚本文本文件操作问题
bash scripting text file manipulation questions
我有一个如下所示的文本文件。分隔符是空格。如您所见,分隔符有时会增加一倍或三倍,因此应将同时存在的分隔符视为单个分隔符。另外,我希望将日期转换为 MySQL 时间戳格式。
889468 216 -rw-r--r-- 1 wls1 wls1 217868 Nov 1 00:42 /home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg
2889469 228 -rw-r--r-- 1 wls1 wls1 231092 Nov 1 01:21 /home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg
2889471 196 -rw-r--r-- 1 wls1 wls1 197452 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg
2889470 196 -rw-r--r-- 1 wls1 wls1 199512 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg
2889472 236 -rw-r--r-- 1 wls1 wls1 240152 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg
2889473 232 -rw-r--r-- 1 wls1 wls1 236876 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg
2889474 224 -rw-r--r-- 1 wls1 wls1 229292 Nov 1 04:22 /home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg
2889475 228 -rw-r--r-- 1 wls1 wls1 230476 Nov 1 04:28 /home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg
2889477 224 -rw-r--r-- 1 wls1 wls1 228708 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg
2889476 216 -rw-r--r-- 1 wls1 wls1 219104 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg
我需要提取文件名的完整路径、时间戳和所有者的用户名。这样生成的文件如下所示。分隔符应该是单个制表符。日期字段应转换为 MySQL 时间戳。
/home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg wls1 2019-11-01 00:42:00
/home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg wls1 2019-11-01 01:21:00
/home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg wls1 2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg wls1 2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg wls1 2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg wls1 2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg wls1 2019-11-01 04:22:00
/home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg wls1 2019-11-01 04:28:00
/home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg wls1 2019-11-01 04:31:00
/home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg wls1 2019-11-01 04:31:00
为了完成上述任务,我一直在尝试这样使用 cat 和 cut:
cat text.txt | cut -d ' ' -f 12,25,27,28,29
我改变了 -f 指令的参数来告诉 cut 我想要哪些列,但我发现它不会将同时出现的空格视为单个分隔符。
上面的 cat/cut 语句产生以下结果:
1 217868 1 00:42
wls1 Nov 1 01:21 /home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg
wls1 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg
wls1 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg
wls1 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg
wls1 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg
wls1 Nov 1 04:22 /home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg
wls1 Nov 1 04:28 /home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg
wls1 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg
wls1 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg
所以,以上是朝着正确方向迈出的一步。
但是注意到顶线了吗?该行中的文件大小少了一个字符,所以它搞砸了。另外,我不确定如何重新排列列的顺序并重新格式化时间戳。
在此先感谢您的帮助!
如果您想从提供的文件 text.txt
开始,请尝试以下操作:
declare -A m2n=([Jan]=1 [Feb]=2 [Mar]=3 [Apr]=4 [May]=5 [Jun]=6 [Jul]=7 [Aug]=8 [Sep]=9 [Oct]=10 [Nov]=11 [Dec]=12)
while IFS= read -r line; do
fname="$(cut -c 73- <<< "$line")"
read -r -a ary <<< "$line"
date=$(printf "%04d-%02d-%02d" "$(date +%Y)" "${m2n[${ary[7]}]}" "${ary[8]}")
time="${ary[9]}:00"
printf "%s\t%s\t%s\t%s\n" "$fname" "${ary[4]}" "$date" "$time"
done < "text.txt"
结果:
/home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg wls1 2019-11-01 00:42:00
/home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg wls1 2019-11-01 01:21:00
/home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg wls1 2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg wls1 2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg wls1 2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg wls1 2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg wls1 2019-11-01 04:22:00
/home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg wls1 2019-11-01 04:28:00
/home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg wls1 2019-11-01 04:31:00
/home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg wls1 2019-11-01 04:31:00
请注意,由于文件名的长度可变,因此列在视觉上没有对齐。
上面脚本的一个潜在问题是年份的获取。年份信息
文件中缺少,您可能需要添加一个条件分支,尤其是在您穿越时
岁月.
如果你能回到原来的文件,直接对它们执行find
命令,
请试试:
find /home/wls1 -type f -name "*.jpg" -printf "%p\t%u\t%TY%Tm%Td\t%TH:%TM:%.2TS\n"
这将为您带来所需的输出。
希望这有帮助。
我有一个如下所示的文本文件。分隔符是空格。如您所见,分隔符有时会增加一倍或三倍,因此应将同时存在的分隔符视为单个分隔符。另外,我希望将日期转换为 MySQL 时间戳格式。
889468 216 -rw-r--r-- 1 wls1 wls1 217868 Nov 1 00:42 /home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg
2889469 228 -rw-r--r-- 1 wls1 wls1 231092 Nov 1 01:21 /home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg
2889471 196 -rw-r--r-- 1 wls1 wls1 197452 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg
2889470 196 -rw-r--r-- 1 wls1 wls1 199512 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg
2889472 236 -rw-r--r-- 1 wls1 wls1 240152 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg
2889473 232 -rw-r--r-- 1 wls1 wls1 236876 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg
2889474 224 -rw-r--r-- 1 wls1 wls1 229292 Nov 1 04:22 /home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg
2889475 228 -rw-r--r-- 1 wls1 wls1 230476 Nov 1 04:28 /home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg
2889477 224 -rw-r--r-- 1 wls1 wls1 228708 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg
2889476 216 -rw-r--r-- 1 wls1 wls1 219104 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg
我需要提取文件名的完整路径、时间戳和所有者的用户名。这样生成的文件如下所示。分隔符应该是单个制表符。日期字段应转换为 MySQL 时间戳。
/home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg wls1 2019-11-01 00:42:00
/home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg wls1 2019-11-01 01:21:00
/home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg wls1 2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg wls1 2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg wls1 2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg wls1 2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg wls1 2019-11-01 04:22:00
/home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg wls1 2019-11-01 04:28:00
/home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg wls1 2019-11-01 04:31:00
/home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg wls1 2019-11-01 04:31:00
为了完成上述任务,我一直在尝试这样使用 cat 和 cut:
cat text.txt | cut -d ' ' -f 12,25,27,28,29
我改变了 -f 指令的参数来告诉 cut 我想要哪些列,但我发现它不会将同时出现的空格视为单个分隔符。
上面的 cat/cut 语句产生以下结果:
1 217868 1 00:42
wls1 Nov 1 01:21 /home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg
wls1 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg
wls1 Nov 1 01:55 /home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg
wls1 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg
wls1 Nov 1 01:57 /home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg
wls1 Nov 1 04:22 /home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg
wls1 Nov 1 04:28 /home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg
wls1 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg
wls1 Nov 1 04:31 /home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg
所以,以上是朝着正确方向迈出的一步。
但是注意到顶线了吗?该行中的文件大小少了一个字符,所以它搞砸了。另外,我不确定如何重新排列列的顺序并重新格式化时间戳。
在此先感谢您的帮助!
如果您想从提供的文件 text.txt
开始,请尝试以下操作:
declare -A m2n=([Jan]=1 [Feb]=2 [Mar]=3 [Apr]=4 [May]=5 [Jun]=6 [Jul]=7 [Aug]=8 [Sep]=9 [Oct]=10 [Nov]=11 [Dec]=12)
while IFS= read -r line; do
fname="$(cut -c 73- <<< "$line")"
read -r -a ary <<< "$line"
date=$(printf "%04d-%02d-%02d" "$(date +%Y)" "${m2n[${ary[7]}]}" "${ary[8]}")
time="${ary[9]}:00"
printf "%s\t%s\t%s\t%s\n" "$fname" "${ary[4]}" "$date" "$time"
done < "text.txt"
结果:
/home/wls1/1800WLS610Entry_20191031194242110_C0NTRA.jpg wls1 2019-11-01 00:42:00
/home/wls1/1800WLS610Entry_20191031202145570_FPP3360.jpg wls1 2019-11-01 01:21:00
/home/wls1/1800WLS610Entry_20191031205544650_0NLY.jpg wls1 2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205544720_C0NTRACT.jpg wls1 2019-11-01 01:55:00
/home/wls1/1800WLS610Entry_20191031205719060_KSK6973.jpg wls1 2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031205748650_KSK6973.jpg wls1 2019-11-01 01:57:00
/home/wls1/1800WLS610Entry_20191031232239000_0NLY.jpg wls1 2019-11-01 04:22:00
/home/wls1/1800WLS610Entry_20191031232853120_0NLY.jpg wls1 2019-11-01 04:28:00
/home/wls1/1800WLS610Entry_20191031231809320_C0NTRACT.jpg wls1 2019-11-01 04:31:00
/home/wls1/1800WLS610Entry_20191031233143530_CTP75.jpg wls1 2019-11-01 04:31:00
请注意,由于文件名的长度可变,因此列在视觉上没有对齐。
上面脚本的一个潜在问题是年份的获取。年份信息 文件中缺少,您可能需要添加一个条件分支,尤其是在您穿越时 岁月.
如果你能回到原来的文件,直接对它们执行find
命令,
请试试:
find /home/wls1 -type f -name "*.jpg" -printf "%p\t%u\t%TY%Tm%Td\t%TH:%TM:%.2TS\n"
这将为您带来所需的输出。
希望这有帮助。