Bash使用条件添加行
我有一个参考文件,其中只有一列是这样的: 文件1:Bash使用条件添加行,bash,line,Bash,Line,我有一个参考文件,其中只有一列是这样的: 文件1: a b c d e 在第二个csv文件中,我有几个列。在这些列的第一列中,参考文件中存在一些值: 文件2: A.34;42;23;45;1 C3.2.1.7.8 E6.2.2.1.三, 我想得到的是,添加file1中存在但file2中不存在的行,其中某些列的值为常量,最后一列的值为零,以便: a;34;42;23;45;1 B成本1;成本2;成本3;成本4;0 C3.2.1.7.8 D成本1;成本2;成本3;成本4;0 E6.2.2.1.三,
a
b
c
d
e 在第二个csv文件中,我有几个列。在这些列的第一列中,参考文件中存在一些值: 文件2:
A.34;42;23;45;1
C3.2.1.7.8
E6.2.2.1.三, 我想得到的是,添加file1中存在但file2中不存在的行,其中某些列的值为常量,最后一列的值为零,以便: a;34;42;23;45;1
B成本1;成本2;成本3;成本4;0
C3.2.1.7.8
D成本1;成本2;成本3;成本4;0
E6.2.2.1.三, 有什么帮助吗 谢谢。
(cat文件2;comm-23文件1(cat文件2;comm-23文件1
( cat file2 ; comm -23 file1 <(cut -d';' -f1 file2) \
| sed 's/$/;cost1;cost2;cost3;cost4;0/' ) | sort
输出将按未定义的顺序进行(除非所有新行都将首先打印)。如果您使用GNU AWK(gawk
),并且需要对行进行排序,则可以将新行保存在数组中,而不是立即打印,然后使用asort()
函数。否则,您可以使用外部排序
实用程序
分为多行:
awk '
BEGIN {
FS = OFS = ";"
}
FNR == NR {
arr[$1] = $0;
next
}
! ($1 in arr) {
print $1, "cost1;cost2;cost3;cost4;0"
}
END {
for (i in arr) {
print arr[i]
}
}' file2 file1
编辑:
要在文件2中容纳具有相同字段1的多行,请更改此行:
arr[$1] = $0;
到
并在其后面立即添加此行:
lines[$0]
然后更改这些行:
for (i in arr) {
print arr[i]
到
编辑2:
要使用不同的值打印添加的行10次,请更改此部分:
! ($1 in arr) {
print $1, "cost1;cost2;cost3;cost4;0"
}
到
!(arr为1美元){
对于(i=1;i
输出将按未定义的顺序进行(除非所有新行都将首先打印)。如果您使用GNU AWK(gawk
),并且需要对行进行排序,则可以将新行保存在数组中,而不是立即打印,然后使用asort()
函数。否则,您可以使用外部排序
实用程序
分为多行:
awk '
BEGIN {
FS = OFS = ";"
}
FNR == NR {
arr[$1] = $0;
next
}
! ($1 in arr) {
print $1, "cost1;cost2;cost3;cost4;0"
}
END {
for (i in arr) {
print arr[i]
}
}' file2 file1
编辑:
要在文件2中容纳具有相同字段1的多行,请更改此行:
arr[$1] = $0;
到
并在其后面立即添加此行:
lines[$0]
然后更改这些行:
for (i in arr) {
print arr[i]
到
编辑2:
要使用不同的值打印添加的行10次,请更改此部分:
! ($1 in arr) {
print $1, "cost1;cost2;cost3;cost4;0"
}
到
!(arr为1美元){
对于(i=1;i这非常有效。唯一的问题是,在文件2中,每一行可以重复多行。因此,例如,带有a、c或d的多行。对于此代码的结尾,每个值只报告一行。希望这是清楚的。无论如何,非常感谢。这非常有用。@g256:qu中未指定该条件估计。请查看我编辑过的答案,以了解应该适应它的更改。轻微更改:如果我想插入缺失的行,让我们假设10次,在const2的位置插入10个不同的常量?(当然,对于所有缺失的行)这会很困难吗?谢谢你的支持。这非常有效。唯一的问题是,在文件2中,每一行可以重复多行。因此,例如,使用a、c或d的多行代码。在代码末尾,每个值只报告一行。希望这是清楚的。无论如何,非常感谢。这非常有用。@g256:that co问题中未指定条件。请参阅我编辑的答案,以了解应适应它的更改。轻微更改:如果我想插入缺失的行,让我们假设在const2位置插入10次,10个不同的常数?(当然,对于所有缺失的行)这会很困难吗?谢谢你的支持。这没问题,它将允许遍历所有行。@octopusgrabbus。但是如何将其放在脚本中,而不是命令行中?我在意外标记附近遇到了语法错误(“
当午餐脚本时。但在命令行中工作。@g256我添加了另一个可以轻松复制和粘贴的变体。我仍然在意外标记附近遇到语法错误。可能是因为我在不同文件的for循环中执行它,例如:for i in*file;do;your code;doneI编辑以避免滚动。您可以加入该行s以形成一行,并确保删除行的延续字符“\”。这样可以,它将允许遍历所有行。@octopusgrabbus。但是如何将其放在脚本中,而不是命令行中?我在意外标记附近遇到语法错误(“
当午餐脚本时。但在命令行中工作。@g256我添加了另一个可以轻松复制和粘贴的变体。我仍然在意外标记附近遇到语法错误。可能是因为我在不同文件的for循环中执行它,例如:for i in*file;do;your code;doneI编辑以避免滚动。您可以加入该行s以形成一行,并确保删除行的延续字符“\”。
! ($1 in arr) {
for (i = 1; i <= 10; i++) {
print $1, "cost1", i, "cost3;cost4;0"
}
}