从IBMiShell上的行按子字符串拆分文件
我有一个很大的文件,上面有很多行,比如从IBMiShell上的行按子字符串拆分文件,shell,split,ibm-midrange,Shell,Split,Ibm Midrange,我有一个很大的文件,上面有很多行,比如 inv_2007_43324234234.csv inv_2007_43377774234.csv inv_2007_43999994234.csv inv_2011_43324265765.csv inv_2007_43324298743.csv inv_2008_97545234234.csv inv_2011_43888234288.csv 第二部分“2007”“2011”是年份。 有没有办法按年度将文件拆分成几个文件? 这些行没有排序。每年应该
inv_2007_43324234234.csv
inv_2007_43377774234.csv
inv_2007_43999994234.csv
inv_2011_43324265765.csv
inv_2007_43324298743.csv
inv_2008_97545234234.csv
inv_2011_43888234288.csv
第二部分“2007”“2011”是年份。有没有办法按年度将文件拆分成几个文件? 这些行没有排序。每年应该有一个文件,其中的文件行中有年份。 我使用IBMiShell 谢谢你 乔吉
我曾多次尝试让命令运行,但现在我有一个错误,我想在回答中描述。 阿努巴瓦回答了这个基本问题。 但我有另一个问题,它使我的命令崩溃 我使用创建我的文件列表
ls > myfiles.dat
myfiles包含上述csv文件。
如果我试图通过awk命令使用此列表
awk -F'_' '{out=$2 ".csv"; print > out}' myfiles.dat
我得到一个名为.csv的csv文件。现在,我将myfiles.dat加载到我的电脑,并在记事本++中打开它。
我复制了其中的一部分,并从notepad.dat创建了一个新文件myfilefromnotepad。
现在,我将新文件从我的pc加载到服务器并运行命令-它可以工作
但是为什么awk不能使用ls创建的列表 如果awk可用,您可以执行以下操作:
awk -F'_' '{out=$2 ".csv"; print > out}' file
如果awk可用,您可以执行以下操作:
awk -F'_' '{out=$2 ".csv"; print > out}' file
仅限shell的解决方案:
while read; do
test -n "$REPLY" && echo $REPLY >> $(expr "$REPLY" : '\(inv_.*\)_').dat;
done < myfiles.dat
读取时;做
测试-n“$REPLY”和&echo$REPLY>>$(expr“$REPLY”:“\(inv.*\)\”.dat;
完成
核查:
while read; do
test -n "$REPLY" && echo $REPLY >> $(expr "$REPLY" : '\(inv_.*\)_').dat;
done <<END
inv_2007_43324234234.csv
inv_2007_43377774234.csv
inv_2007_43999994234.csv
inv_2011_43324265765.csv
inv_2007_43324298743.csv
inv_2008_97545234234.csv
inv_2011_43888234288.csv
END
读取时;做
测试-n“$REPLY”和&echo$REPLY>>$(expr“$REPLY”:“\(inv.*\)\”.dat;
完成纯壳解决方案:
while read; do
test -n "$REPLY" && echo $REPLY >> $(expr "$REPLY" : '\(inv_.*\)_').dat;
done < myfiles.dat
读取时;做
测试-n“$REPLY”和&echo$REPLY>>$(expr“$REPLY”:“\(inv.*\)\”.dat;
完成
核查:
while read; do
test -n "$REPLY" && echo $REPLY >> $(expr "$REPLY" : '\(inv_.*\)_').dat;
done <<END
inv_2007_43324234234.csv
inv_2007_43377774234.csv
inv_2007_43999994234.csv
inv_2011_43324265765.csv
inv_2007_43324298743.csv
inv_2008_97545234234.csv
inv_2011_43888234288.csv
END
读取时;做
测试-n“$REPLY”和&echo$REPLY>>$(expr“$REPLY”:“\(inv.*\)\”.dat;
完成抱歉,一个问题:我的测试文件工作正常。最后我有CRLF。我的真实文件非常大,由ls-d创建$PWD/*结尾有LF。如果我尝试对真实文件jaust运行awk命令,将创建一个带有.csv的文件。testfile和realfile之间的唯一区别在于行数和行尾。他们之间没有区别。我在回答中描述了我的问题。你有什么想法吗?它在每一行的末尾显示一个$inv\u 2007\u 433242344.csv$
问题不仅仅在于awk。JamesA的回答也不起作用。如果我把列表保存在我的电脑上——创建一个新的dos文件并将其发送到服务器上,al工作正常,但是为什么呢?好的,我理解。我已经看到我的ls输出没有排序。我在许多帖子中读到,这应该是ls命令中的默认值。这应该是个问题吗?抱歉,有一个问题:我的测试文件工作正常。最后我有CRLF。我的真实文件非常大,由ls-d创建$PWD/*结尾有LF。如果我尝试对真实文件jaust运行awk命令,将创建一个带有.csv的文件。testfile和realfile之间的唯一区别在于行数和行尾。他们之间没有区别。我在回答中描述了我的问题。你有什么想法吗?它在每一行的末尾显示一个$inv\u 2007\u 433242344.csv$
问题不仅仅在于awk。JamesA的回答也不起作用。如果我把列表保存在我的电脑上——创建一个新的dos文件并将其发送到服务器上,al工作正常,但是为什么呢?好的,我理解。我已经看到我的ls输出没有排序。我在许多帖子中读到,这应该是ls命令中的默认值。这应该是个问题吗?这对我不管用?我将列表中的所有文件都作为单个文件获取?@user1121575您能举个例子吗?您是否在QSH
提示符下运行此操作?听起来像是打字错误。嗨,詹姆斯,我用qsh运行命令。如果我在我的笔记本电脑上复制你的例子,并在qsh中运行脚本,我会得到和你一样的结果。但是我使用我的列表文件作为输入,我得到一个名为.dat的大文件,并且没有几个带有[year]的文件。dat@user1121575您能列出运行这些命令的步骤吗?记事本和在qsh中运行记事本之间可能存在翻译问题。如果您可以包含以下输出,那将非常有用:ls-S myfiles.dat;head myfiles.dat | od-c-tx1
。这对我不起作用吗?我将列表中的所有文件都作为单个文件获取?@user1121575您能举个例子吗?您是否在QSH
提示符下运行此操作?听起来像是打字错误。嗨,詹姆斯,我用qsh运行命令。如果我在我的笔记本电脑上复制你的例子,并在qsh中运行脚本,我会得到和你一样的结果。但是我使用我的列表文件作为输入,我得到一个名为.dat的大文件,并且没有几个带有[year]的文件。dat@user1121575您能列出运行这些命令的步骤吗?记事本和在qsh中运行记事本之间可能存在翻译问题。如果您可以包含以下输出,那将非常有用:ls-S myfiles.dat;head myfiles.dat | od-c-tx1
。