Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从IBMiShell上的行按子字符串拆分文件_Shell_Split_Ibm Midrange - Fatal编程技术网

从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