以下是我的文件1内容:
<?php
$servername = "localhost";
$username = "root";
$password = "*****";
$dbname = "clock";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
if(isset($_POST['submit'])){
$stmt = $conn->prepare("INSERT INTO input(value) VALUES (?)");
$stmt->bind_param('s',$_POST['value']);
//The argument may be one of four types:
//i - integer
//d - double
//s - string
//b - BLOB
//change it by respectively
if ($stmt->execute() == TRUE && $stmt->affected_rows>0) {
echo "New record created successfully";
} else {
echo "Error: <br>" . $conn->error;
}
}
$conn->close();
?>
这是我的文件2内容
123|yid|def|
456|kks|jkl|
789|mno|vsasd|
我想在基于文件2的文件1中比较的唯一内容是第1列。根据上面的文件,输出应该只输出:
123|abc|def|
456|ghi|jkl|
789|mno|pqr|
134|rst|uvw|
行到行比较不是答案,因为第2列和第3列都包含不同的内容,但只有第1列在两个文件中包含完全相同的内容。
我怎样才能做到这一点?
目前我在我的代码中使用它:
134|rst|uvw|
答案 0 :(得分:4)
您可以非常轻松地在Awk
执行此操作!
awk 'BEGIN{FS=OFS="|"}FNR==NR{unique[$1]; next}!($1 in unique)' file1 file2
Awk
一次处理输入行一个。并且Awk
提供了一些特殊条款,BEGIN{}
和END{}
,其中包含要在处理文件之前和之后运行的操作。
因此,在文件处理发生之前设置了部分BEGIN{FS=OFS="|"}
,FS
和OFS
是Awk
中的特殊变量,代表输入和输出字段分隔符。由于您提供的文件已被|
解除限制,因此您需要设置FS="|"
并使用|
将其打印回来进行解析,因此请设置OFS="|"
< / p>
命令的主要部分出现在BEGIN
子句之后,部分FNR==NR
用于处理命令中提供的第一个文件参数,因为FNR
跟踪行号对于两个文件合并,NR
仅用于当前文件。因此,对于第一个文件中的每个$1
,将值散列到名为unique
的数组中,然后当下一个文件处理发生时,部分!($1 in unique)
将将这些行放在第二个文件中,其$1
值不是散列数组。
答案 1 :(得分:1)
这是另一个使用join
,sort
和grep
join -t"|" -j 1 -a 2 <(sort -t"|" -k1,1 file1) <(sort -t"|" -k1,1 file2) |\
grep -E -v '.*\|.*\|.*\|.*\|'
join
在这做两件事。它将来自两个文件的所有行与匹配键配对,并使用-a 2
选项打印来自file2的不匹配行。
由于join
要求对输入文件进行排序,我们会对它们进行排序。
最后,grep
将从输出中删除包含三个以上字段的所有行。