给出一个带有文件名列表(带有文件路径)的文件,例如:
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
对于所有其他日期类似。
答案 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