首页 > 解决方案 > bash脚本文本文件操作问题

问题描述

我有一个如下所示的文本文件。分隔符是空格。如您所见,分隔符有时会加倍或增加三倍,因此应将同时的分隔符视为单个分隔符。另外,我希望将日期转换为 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

因此,以上是朝着正确方向迈出的一步。

但注意到那条顶线了吗?文件大小在那一行少了一个字符,所以它搞砸了。另外,我不确定如何重新排列列的顺序并重新格式化时间戳。

在此先感谢您的帮助!

标签: bashtextdata-manipulationcutcat

解决方案


如果您想从提供的文件开始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"

这将为您带来所需的输出。
希望这可以帮助。


推荐阅读