我有一个包含以 分隔的数据的文件|
。
例如:(输入)
a|b|c|d`LF`
D|e
a1|b1|c1|d1`LF`
d2|e1\n
输出:(LF
从第 4 列删除)
a|b|c|dD|e
a1|b1|c1|d1d2|e1\n
我想LF
使用 从特定列中删除sed
。是否可以LF
从特定列中删除字符。
答案1
你的意思是做类似的事情:
#!/usr/bin/awk -f
BEGIN { FS = "|"; OFS = "|"; i=0 }
{
a[i]=(a[i] ?
sprintf("%s%s\n", a[i], $0) : sprintf("%s", $0))
if(NF!=4) {
++i
}
}
END {
for(e in a) {
printf("%s", a[e])
}
}
然后你用以下命令运行它-f
:
awk -f script.awk text.txt
答案2
我认为您的输入文件是在 Windows 平台上制作的,以 CR(回车符)行结尾;
如果你这样做,cat -e filename.txt
你会看到类似以下的内容(注意字符^M
):
a|b|c|d^M$
D|e$
a1|b1|c1|d1^M$
d2|e1\n$
为此,您可以执行以下操作:
CR=$'\r' ; sed -E ":a /${CR}$/ { N; s/\n//; ta; }; s/${CR}//g;" infile.txt
a|b|c|dD|e
a1|b1|c1|d1d2|e1\n
如果你的 shell 不能识别,printf
则使用CR=$(printf %s '\r')
ANSI-C 引用语法类似$'\r'
。