使用 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"
(假设选择 ||
是出于某种审美原因,而不是为了在每个字段中使用单个管道。)
请建议完美的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"
(假设选择 ||
是出于某种审美原因,而不是为了在每个字段中使用单个管道。)