2017-06-01 75 views
-2

我想用awk/sed处理以下两个文件(A.TXT和b.txt),并得到结果 cat a.txt如何用awk/sed来处理这两个文件得到的结果,我想

a UK 
b Japan 
c China 
d Korea 
e US 

而且cat b.txt导致

c Russia 
e Canada 

我需要的结果如下:

a UK 
b Japan 
c Russia 
d Korea 
e Canada 
+4

你尝试过什么解决呢? – Sundeep

+0

[编辑]你的问题,并使用'{}'按钮来格式化你的输入,输出和代码。 –

+0

谢谢。我试过用awk来解决这个问题。不过,我是awk的新手。你们能给我一些提示吗?谢谢 –

回答

0

尝试:

awk 'FNR==NR{A[$1]=$NF;next} {printf("%s %s\n",$1,$1 in A?A[$1]:$NF)}' b.txt a.txt 

检查这里的条件FNR == NR这将是只有当读取第一个文件(b.txt)TRUE。然后创建一个名为A的数组,其索引为$ 1,并具有值最后一列。然后使用printf打印2个字符串,其中第一个字符串是$ 1,另一个是如果a.txt中的$ 1存在于数组A中,则打印数组A的索引为$ 1的值,否则打印a.tzt本身的最后一列。

编辑:因为OP有马车字符到Input_files所以请删除他们也遵循。

tr -d '\r' <b.txt> temp_b.txt && mv temp_b.txt b.txt 
+1

你有正确的想法,但 - 为什么使用名为“A”的数组来表示名为“b”的文件的内容,特别是当其他文件被命名为“a”时,为什么要混淆你的代码?不要将所有大写变量名称用于在线讨论的所有常见原因。为了便于跨awk版本添加三元表达式的加括号(某些awks会在某些情况下会出现语法错误)。为什么在简单打印时使用printf呢?当你的代码依赖于只有2个字段时,为什么使用$ NF而不是$ 2?请参阅https://stackoverflow.com/a/44311894/1745001。 –

+0

有时第一行不会改变,其余的都可以。我不知道为什么,你能给我一些提示 –

+0

请给我们展示一些例子,我们可以帮助更多。 – RavinderSingh13

0

您可以使用下面的一行:

join -a 1 -a 2 a.txt <(awk '{print $1, "--", $0, "--"}' < b.txt) | sed 's/ --$//' | awk -F ' -- ' '{print $NF}' 

我们用awk前缀b.txt每一行的一个键和--以后给我们一个分割点:

<(awk '{print $1, "--", $0, "--"}' < b.txt) 

使用join命令加入公共密钥上的文件。该-a 1选项告诉命令

join -a 1 -a 2 a.txt <(awk '{print $1, "--", $0, "--"}' < b.txt) 

用sed删除--部分是上线的一些终端:

sed 's/ --$//' 

用awk在每行的最后一个项目:

awk -F ' -- ' '{print $NF}' 
+0

或打印第一列和最后一列:'join -a 1 file1 file2 | awk'{print $ 1,$ NF}'' – Cyrus

+0

@Cyrus:假定输入文件只包含每个键的一个单词。 “韩国”只会导致“韩国”。 –

+1

是的,我只用了Yu Franco的例子。 – Cyrus

1

用awk:

先填充aray/hash a与完整行($0)并使用此行中的第一列($1)作为索引。最后,用循环打印所有数组/散列a的元素。

awk '{a[$1]=$0} END{for(i in a) print a[i]}' file1 file2 

输出:

 
a UK 
b Japan 
c Russia 
d Korea 
e Canada 
0
$ awk 'NR==FNR{b[$1]=$2;next} {print $1, ($1 in b ? b[$1] : $2)}' b.txt a.txt 
a UK 
b Japan 
c Russia 
d Korea 
e Canada 
相关问题