我正在尝试编写一个简单的shell脚本来读取文件,并在文件读取时找到另一个文件名,并在两个文件上执行一些基本操作(cp和mv),下面是简化代码(但结果是相同的):
#!/bin/bash
for header in `ls -l XXXXACT_*.dat | awk '{ print $9 }'`
do
payload=`cat $header | nawk -F "/" '{ print $8 }' | sed 's/APP.*//' | tr -d "\012"`
echo "$header"
echo "$payload"
ls -l $payload
我得到的结果如下:
XXXXFACT_000000424.dat
FILEACT_000424.TXT
FILEACT_000424.TXT: No such file or directory
但如果我在文件名上运行ls,我会得到一个结果:
ls -l FILEACT_000424.TXT
-rwxr-xr-x 1 stlts stlts 292 Feb 9 12:14 FILEACT_000424.TXT
在下面找到文件XXXXFACT_000000424.dat:
的示例0000 APP_APPLI_CODE XXXFACTAPP_FILE_NB 000424APP_FLOW IMPORT
0101 APP_MSG_NB 001APP_COMPANY XXXXXXXX_TESTAPP_SERVICE XXXXXS0_IMPORTAPP_MSG_NAT FICAPP_MSG_TYPE FICAPP_CORR_ID XXXXXX20XXXAPP_MSG_TXT_TYPE FICAPP_MSG_TXT /xxxxx/xxxxx/xxxxx/fileact/xxxxxx/import/FILEACT_000424.TXTAPP_ENDFCT EOM
0000 APP_ENDFILE EOF
对于我为什么会遇到这种行为以及/或有关如何解决这个问题的想法/建议的任何解释都是受欢迎的。
该脚本将在SunOs 5.10上运行,我使用cp获得以下结果:
cp: cannot access FILEACT_000424.TXT
我确保我在正确的目录中。
感谢阅读。
答案 0 :(得分:2)
对于您从Windows复制的文件,请使用dos2unix
重写您的代码段:
for header in XXXXACT_*.dat; do
payload=$( nawk '/\/.*APP/ {sub(/.*\//,""); sub(/APP.*/,""); print}' "$header" )
echo "$header"
echo "$payload"
ls -l "$payload"
注释
ls
输出,直接遍历文件名扩展cat
awk
可以执行您使用sed
$()
代替反对"$variables"
,除非您确切知道何时不使用它们。答案 1 :(得分:0)
感谢大家阅读并提出了解决问题的新方法,这是我在这里的第一篇文章,我已经学到了很多东西!
我想通了,我在$ header文件上运行了一个cat -v,可以看到$ payload文件名后面不可见:
FILEACT_000093.TXT^W
我试图用sed作为测试删除它,示例代码如下:
for header in XXXXFACT_*.dat; do
payload=$( nawk '/\/.*APP/ {sub(/.*\//,""); sub(/APP.*/,""); print}' "$header" )
echo $header
payloadx=$( echo "${payload}" | sed 's/^W//g' )
echo "$payloadx"
ls -l "$payloadx"
echo ""
done
以上按预期工作