每个日期只创建一个与该日期对应的文件名的文件

时间:2019-01-28 10:58:30

标签: bash unix awk scripting

给出一个带有文件名列表(带有文件路径)的文件,例如:

input.txt (contents):
/2018/06/01/abc.txt
/2018/06/01/xyz.txt
/2018/06/02/abc.txt
/2018/06/02/xyz.txt
/2018/06/03/xyz.txt
/2018/06/03/abc.txt
/2018/06/01/ghi.txt

... 每个日期必须创建一个文件,并且只包含与该日期对应的文件名 (全部使用标准Unix命令) 例如 预期输出:

cat 2018-06-01.txt =>
/2018/06/01/abc.txt
/2018/06/01/xyz.txt
/2018/06/01/ghi.txt

cat 2018-06-02.txt =>
/2018/06/02/abc.txt
/2018/06/02/xyz.txt

对于所有其他日期类似。

4 个答案:

答案 0 :(得分:1)

使用awk:

$ awk '
{
    split($0,a,/[/.]/)                 # split record on chars ./
    f=a[2] "-" a[3] "-" a[4] ".txt"    # make filename 
    print >> f                         # print (appending) to file
    close(f)                           # close the file to preserve fds
}' input.txt

已创建文件:

$ ls
2018-06-01.txt
2018-06-02.txt
2018-06-03.txt

文件内容:

$ cat 2018-06-01.txt
/2018/06/01/abc.txt
/2018/06/01/xyz.txt
/2018/06/01/ghi.txt

请注意,没有错误检查。

答案 1 :(得分:1)

您能否也尝试遵循以下方法,与James先生有点不同,我只在Input_file(第二,第三和第四字段)中更改其值时关闭输出文件,而不是等于先前的输出文件名(而是然后在每一行中将其关闭)。还将/用作行的字段分隔符。

awk '
BEGIN{
  FS="/"
  OFS="-"
}
{
  file=$2 OFS $3 OFS $4".txt"
}
prev!=file{
  close(prev)
  prev=file
}
{
  print >> (file)
}'  Input_file

答案 2 :(得分:1)

使用GNU awk的gensub()和内部打开文件控件:

awk '{print > gensub("/([^/]+)/([^/]+)/([^/]+)/[^.]+","\\1-\\2-\\3",1)}' file

答案 3 :(得分:0)

使用简单的bash脚本。

#!/bin/bash
set -e
for i in `cat input.txt`
do
  y=`echo $i|cut -d "/" -f2`
  m=`echo $i|cut -d "/" -f3`
  d=`echo $i|cut -d "/" -f4`
  f_name=`echo "${y}-${m}-${d}.txt"`
  echo $i >>$f_name

done
埃德·莫顿(Ed Morton)的

编辑(请参阅下面的评论)

仅修复上面的反模式和错误,但实际上并没有对其进行改进,并且仍然没有暗示这将是一种合理的方法:

#!/bin/env bash
set -e
while read -r i; do
  y=$(echo "$i"|cut -d '/' -f2)
  m=$(echo "$i"|cut -d '/' -f3)
  d=$(echo "$i"|cut -d '/' -f4)
  f_name="${y}-${m}-${d}.txt"
  echo "$i" >>"$f_name"

done < input.txt