使用 shell 脚本命令从文件中删除“||”(双竖线)分隔的多列

Remove '||'(double pipe) separated multiple columns from file using shell script command

请建议完美的shell脚本命令来删除最后两个'||'分隔符从文件中分隔列。(让我们假设下面的例子) 文件名:abc.dat

"a1"||"a2"||"a3"||"a4"
"b1"||"b2"||"b3"||"b4"
"c1"||"c2"||"c3"||"c4"

输出应该是这样的:

"a1"||"a2"
"b1"||"b2"
"c1"||"c2"

我尝试了以下 cut 和 awk 命令但没有成功:

awk -F '||' '{print }'  ${file} >> ${file}
cut -d'||' -f2 --complement ${file} >> ${file} (not working as cut: the delimiter must be a single character)

使用您展示的示例,请尝试执行以下操作。将字段分隔符设置为 ||(将其转义以处理文字字符)并将 OFS 也设置为 ||。然后为 Input_file.

的每一行打印第一个和第二个字段
awk -F'\|\|' -v OFS="||" '{print ,}' Input_file

一旦您对上述命令的结果感到满意,还可以对 Input_file 本身进行更改,然后尝试执行以下操作。

awk -F'\|\|' -v OFS="||" '{print ,}' Input_file > temp && mv temp Input_file


第二个解决方案: 使用 GNU grep 尝试以下。

grep -oP '^.*?\|\|"[^"]*' Input_file

您可以使用:

awk '{sub(/(\|{2}[^|]*){2}$/, "")} 1' file

"a1"||"a2"
"b1"||"b2"
"c1"||"c2"

或者如果您只想删除最后 2 列而不关心总共使用了多少列:

awk -F '\|{2}' -v OFS='||' '{
   $NF = $(NF-1) = ""
   sub(/([|]{2})*$/, "")
} 1' file

与其假设 || 是分隔符,不如假设 | 是分隔符并且第二个字段为空。

$ cut -d'|' -f1-3 <<EOF
> "a1"||"a2"||"a3"||"a4"
> "b1"||"b2"||"b3"||"b4"
> "c1"||"c2"||"c3"||"c4"
> EOF
"a1"||"a2"
"b1"||"b2"
"c1"||"c2"

(假设选择 || 是出于某种审美原因,而不是为了在每个字段中使用单个管道。)