我必须输入.txt需要由shell脚本格式化的文件
,条件如下- 删除前两行和 最后两行
- 删除每个中的所有空格 行(每行有两个空格,位于 开头和结尾一个空格)
- 每行应在单个行内 引号(' ')
- 最后将换行符($) 替换为 逗号。
(原文)输入.txt
sql
--------
Abce
Bca
Efr
-------
Row (3)
所需的输出文件
输出.txt
'Abce','Bca','Efr'
我试过使用以下命令
Sed -i 1,2d input.txt > input.txt
Sed "$(( $(wc -l <input.txt) -2+1)), $ d" Input.txt > input.txt
Sed ':a;N;$!ba;s/n/, /g' input.txt > output.txt
但是我得到空白输出.txt
请您尝试以下操作:
mapfile -t ary < <(tail -n +3 input.txt | head -n -2 | sed -E "s/^[[:blank:]]*/'/; s/[[:blank:]]*$/'/")
(IFS=,; echo "${ary[*]}")
tail -n +3
输出第 3 行之后的行- (包括第 3 行)。
head -n -2
输出不包括最后 2 行的行。sed -E "s/^[[:blank:]]*/'/"
删除前导空格和前置 单引号。- 同样,sed 命令
"s/[[:blank:]]*$/'/"
删除尾随 空格并附加单个引号。 - 语法 <(命令 ..) 是一个进程替换和 括号内命令的输出将馈送到
mapfile
通过重定向。 mapfile -t ary
从标准输入读取到数组中的行 名为ary
的变量。echo "${ary[*]}"
扩展到单个字符串,其内容为 数组ary
由IFS
的值分隔,该值刚刚赋值 到逗号。IFS
的分配和阵列扩展用 要在子外壳中执行的括号。这可以防止IFS
在当前进程中进行修改。
使用您显示的样本,请尝试按照awk
程序进行操作。用GNUawk
编写和测试,应该适用于任何版本。
awk -v s1="'" -v lines="$(wc -l < Input_file)" '
BEGIN{ OFS="," }
FNR==(lines-1) {
print val
exit
}
FNR>2{
sub(/^[[:space:]]+/,"")
val=(val?val OFS:"") (s1 $0 s1)
}
' Input_file
说明:为上面的代码添加详细说明,仅用于说明目的。
awk -v s1="'" -v lines="$(wc -l < Input_file)" ' ##Starting awk program, setting s1 variable to ' and creating lines which has total number of lines in it, using wc -l command on Input_file file.
BEGIN{ OFS="," } ##Setting OFS to comma in BEGIN section of this program.
FNR==(lines-1) { ##Checking condition if its 2nd last line of Input_file.
print val ##Then printing val here.
exit ##exiting from program from here.
}
FNR>2{ ##Checking condition if FNR is greater than 2 then do following.
sub(/^[[:space:]]+/,"") ##Substituting initial spaces with NULL here.
val=(val?val OFS:"") (s1 $0 s1) ##Creating val which has ' current line ' in it and keep adding it in val.
}
' Input_file ##Mentioning Input_file name here.
如果您知道输入足够小,可以放入内存:
$ awk '
NR>4 { gsub(/^ *| *$/,"