我正在尝试使用脚本合并两个不同长度的文件。我希望将较长的文件附加到较短文件的末尾,并且当两个文件长度相等时,它们应该以任何顺序合并到目前为止我的脚本:
#!/bin/csh -f
echo ENTER a file name
set fl1 = $<
echo ENTER a second file name
set fl2 = $<
var1 = $( wc -c $fl1 )
var2 = $( wc -c $fl2 )
if ( ! -e $fl1 && ! -e $fl2 ) then
echo File does not exist
echo -n Please enter a vaild file name
else if { $var1 -lt $var2 } then
$fl2 >> $fl1
else if { $var1 -gt $var2 } then
$fl1 >> $fl2
else if { $var1 -eq $var2 } then
$fl2 >> $fl1 || $fl1 >> $fl2
endif
答案1
您的脚本存在很多问题。第一个也是最重要的是您正在使用csh
.不。作为脚本语言,它有许多缺点,其中之一csh
就是不支持$()
,你需要 backtics。cat
为了连接文件,您还需要不能像程序一样执行文件。无论如何,如果您想打印其内容,则不行。你的语法也有if
错误。最后,你不需要else if
。由于您只需执行两个操作,那么检查三个不同的条件有什么意义呢?除了一个条件之外的所有条件都会做同样的事情,所以只需使用if ... else
.
您的脚本的工作版本csh
将是:
#!/home/terdon/bsd-csh -f
echo ENTER a file name
set fl1 = $<
echo ENTER a second file name
set fl2 = $<
set var1 = `wc -c < "$fl1"`
set var2 = `wc -c < "$fl2"`
echo "V: $var1 $var2"
if ( ! -e "$fl1" && ! -e "$fl2" ) then
echo File does not exist
echo -n Please enter a vaild file name
else if ( "$var1" > "$var2" ) then
cat "$fl2" >> "$fl1"
else
cat "$fl1" >> "$fl2"
endif
这是一个在 bash 中具有相同功能的脚本,只是为了说明您缺少的内容:
#!/bin/bash
read -p "ENTER a file name:" fl1
read -p "ENTER a second file name:" fl2
[[ -e "$fl1" && -e "$fl2" ]] ||
echo "File does not exist, please enter a vaild file name" && exit;
if [[ $(wc -c "$fl1") -lt $(wc -c "$fl2") ]]
then
cat "$fl2" >> "$fl1"
else
cat "$fl1" >> "$fl2"
fi
答案2
如果没有任何效果,您始终可以在脚本中包含一个执行您尝试执行的操作(几乎)的命令,有很多方法可以执行此操作,例如
to join file1.txt, file2.txt and file3.txt consecutively together to new file: file4.txt use:
copy/b file1.txt +file2.txt +file3.txt file4.txt
or:
copy/b *.txt newfile.txt
您还可以使用类似命令pr
和vim
变体命令来实现它。如何在您的脚本中使用此命令(如果没有任何效果)我将留给您。但是,是的,这是一个不好的做法。这应该是你最后的手段。